//ICC-AVR application builder : 2017-03-04 9:53:16
// Target : M169
// Crystal: 11.059Mhz
#include <iom169v.h>
#include <macros.h>
#define CS_1 PORTC|=(1<<PE4)
#define CS_0 PORTC&=~(1<<PE4)
#define WR_0 PORTC&=~(1<<PE3)
#define WR_1 PORTC|=(1<<PE3)
#define DA_1 PORTC|=(1<<PE2)
#define DA_0 PORTC&=~(1<<PE2)
#define uint unsigned int
#define uchar unsigned char
#define XTAL 11.0592
uchar display[]={0xBE,0x06,0x7C,0x5E,0xC6,0xDA,0xFA,0x0E,0xFE,0xDE, //0~9
0xBF,0x07,0x7D,0x5F,0xC7,0xDB,0xFB,0x0F,0xFF,0xDF}; //0.~9
uint disbit[]={0x1558,0x1554,0x1552,0x15A2,0x15F8,0x15F4,0x15F2,0x1550,0x15A0,0x15F0};
// k1 k2 k3 col k4 k5 k6 0ffk123 offcol offk456;
void delay(uint z) //延时 没一个delay(1) 是一毫秒?
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void lay(uchar m)
{
uchar x,y;
for(x=m;x>0;x--)
for(y=20;y>0;y--);
}
/* 1ms延时程序*/
void delay_1ms(void)
{
unsigned int i;
for(i=1;i<(unsigned int)(XTAL*142-2);i++);
}
/* n ms延时程序*/
void delay_ms(unsigned int time)
{
unsigned int i=0;
while(i<time)
{
delay_1ms();
i++;
}
}
/******************************************************
-功能:右循环位移
-参数:dat:需位移的量 n:位移的位数
-返回:位移后的量
整数循环右移
******************************************************/
unsigned int iror(unsigned int dat,unsigned int n)
{
unsigned int i;
n%=16;
if(n==0)
{
return dat;
}
for(i=1;i<=n;i++)
{
if(dat&0x0001)
{
dat>>=1;
dat|=0x8000;
}
else
{
dat>>=1;
}
}
return dat;
}
/******************************************************
-功能:右循环位移
-参数:dat:需位移的量 n:位移的位数
-返回:位移后的量
字符循环右移
******************************************************/
unsigned char cror(unsigned char dat,unsigned char n)
{
unsigned char i;
n%=8;
if(n==0)
{
return dat;
}
for(i=1;i<=n;i++)
{
if(dat&0x01)
{
dat>>=1;
dat|=0x80;
}
else
{
dat>>=1;
}
}
return dat;
}
/**********LCM045驱动部分*********************/
void wrt_com(uint z) //液晶写命令
{
int i,t;
CS_0;
lay(5);
for(i=11;i>=0;i--)
{
WR_0;
if(i==11)
DA_1;
else if(i==10||i==9)
DA_0;
else
{
t=iror(z,i);
// DATA=1&t;
if((1&t)==1)
{
DA_1;
}
else
{
DA_0;
}
}
WR_1;
lay(5);
if(i==-1)
break;
}
CS_1;
lay(10);
}
void wrt_s(uchar a,uchar b,uchar c,uchar d) //液晶连续写数据
{
uchar q=0,i,m,num[4];
int s=7,t;
m=0;
num[0]=display[a];
num[1]=display[b];
num[2]=display[c];
num[3]=display[d];
CS_0;
lay(1);
for(i=9;i>=0;i--)
{
WR_0;
lay(1);
if(i==9)
DA_1;
else if(i>0&&i<9)
{ t=cror(0x56,(i-1));
// DATA=1&t;
if((1&t)==1)
{
DA_1;
}
else
{
DA_0;
}
}
if(i==0)
{ m++;
if(m>16&&m<21)
{ DA_0;
i++;
}
else
{
t=iror(num[q],s);
// DATA=1&t;
if((1&t)==1)
{
DA_1;
}
else
{
DA_0;
}
s--;
if(s==-1&&q==3)
break;
i++;
if(s==-1)
{
q++;
s=7;
}
}
}
lay(1);
WR_1;
lay(1);
}
CS_1;
lay(1);
}
void wrt_data(uint z) //液晶单独写数据
{
uint i,t;
CS_0;
lay(5);
for(i=12;i>=0;i--)
{
WR_0;
if(i==12)
DA_1;
else if(i==11)
DA_0;
else if(i==10)
DA_1;
else
{
t=iror(z,i);
// DATA=1&t;
if((1&t)==1)
{
DA_1;
}
else
{
DA_0;
}
}
WR_1;
lay(5);
if(i==0)
break;
}
CS_1;
lay(10);
}
void set_lcm045(void) //初始化;
{
uchar i,t,j=0;
delay(30);
CS_1;
WR_1;
DA_1;
wrt_com(0x852);
wrt_com(0x830);
wrt_com(0x802);
wrt_com(0x806);
delay(1);
CS_0;
lay(1);
for(i=9;i>=0;i--)
{
WR_0;
lay(1);
if(i==9)
DA_1;
else if(i>0&&i<9)
{
t=cror(0x55,(i-1));
//DATA=1&t;
if((1&t)==1)
{
DA_1;
}
else
{
DA_0;
}
}
else
{ DA_0;i++;j++;
if(j==45)
break;
}
lay(1);WR_1;lay(1);
}
CS_1;lay(1);
}
void port_init(void)
{
PORTA = 0x00;
DDRA = 0x00;
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0x00;
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0x00;
PORTE = 0xFF;
DDRE = 0xFF;
PORTF = 0x00;
DDRF = 0x00;
PORTG = 0x00;
DDRG = 0x00;
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
TIMSK0 = 0x00; //timer interrupt sources
TIMSK1 = 0x00; //timer interrupt sources
TIMSK2 = 0x00; //timer interrupt sources
PCMSK0 = 0x00; //pin change mask
PCMSK1 = 0x00; //pin change mask
EICRA = 0x00; //int0 setup
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
void main(void)
{
init_devices();
//set_lcm045();
//wrt_s(1,1,1,1);
while(1)
{
CS_0;
WR_0;
DA_0;
}
}