|
/*Main.c*/ #include "global.c" void SystemInit(); void KickDog(); void ShowChar(unsigned char,unsigned char,unsigned char); void Init_Lcd(void); void Clr_Lcd(void); void Judge1_Ready(void); void Judge2_Ready(void); void Write_Code(void); void Write1_Data(void); void Write2_Data(void); void Lcd_Delay(void); void Lcd_Delay1(void); void QCACU(); unsigned int temp1,temp2; unsigned long code_addr,data_addr; unsigned int LineChar=16; unsigned int ColumnChar=8; unsigned int chresult[2][16]={ {0x00,0x11,0x0e,0x15,0x0a,0x11,0x0e,0x15,0x1d,0x12,0x0e,0x12,0x15,0x00,0x00,0x00}, /*;21H!*/ {00,00,00,0x0,0x0,00,00,00,00,00,00,00,00,00,00,00}};
int qfloat; main() {
SystemInit(); //系统初始化 QCACU(); MCRA=MCRA & 0xC0FF; //IOPB0-6设为IO口模式 PBDATDIR=0xFFC2; //所有LED=0 PBDATDIR=PBDATDIR |0x003D; //所有LED=1 code_addr=0x8010; data_addr=0x8000; MCRC=MCRC & 0xFFF0; PEDATDIR=PEDATDIR | 0x0200; PEDATDIR=PEDATDIR & 0xFFFD; asm(" nop "); asm(" nop "); asm(" nop "); asm(" nop "); PEDATDIR=PEDATDIR | 0x0202; Init_Lcd(); ShowChar(3,0,0); while(1); } void QCACU() { unsigned int i=0,m=0,n=0,ch,qf2; int endflag=1; unsigned long int qf=0x180; /*Q8格式表示为1.5*/ unsigned int *addr=(unsigned int *)0x8500; /*数据存储地址*/ qf=(qf*qf)>>8; qfloat=(int)qf; /*Q8格式qfloat=576*/ *addr=qfloat;
} void SystemInit() { asm(" SETC INTM "); /* 关闭总中断 */ asm(" CLRC SXM "); /* 禁止符号位扩展 */ asm(" CLRC CNF "); /* B0块映射为 on-chip DARAM*/ asm(" CLRC OVM "); /* 累加器结果正常溢出*/ SCSR1=0x83FE; /* 系统时钟CLKOUT=20*0.5=10M */ /* 打开ADC,EVA,EVB,CAN和SCI的时钟,系统时钟CLKOUT=10M */ WDCR=0x006F; /* 禁止看门狗,看门狗时钟64分频 */ KickDog(); /* 初始化看门狗 */ IFR=0xFFFF; /* 清除中断标志 */ IMR=0x0000; /* 关闭中断*/ }
void ShowChar(unsigned char lin,unsigned char column,unsigned char k) { unsigned char i;
unsigned int StartAddr;
StartAddr=lin*LineChar +column; //定位起始行
for(i=0;i<16;i++) { data1=(unsigned char)(StartAddr); data2=(unsigned char)(StartAddr>>8); data3=0x24; Write1_Data(); Write2_Data(); Write_Code(); data1=chresult[k][i]; Write1_Data(); data3=0xc4; Write_Code(); StartAddr=StartAddr + 1; }
}
void Init_Lcd() { data1=0x00; //图形区首址 (0000H) data2=0x08; data3=0x42; Write1_Data(); Write2_Data(); Write_Code(); data1=0x10; //图形区宽度 data2=0x00; data3=0x43; Write1_Data(); Write2_Data(); Write_Code(); data1=0x00; //文本区首址(1000h) data2=0x00; data3=0x40; Write1_Data(); Write2_Data(); Write_Code(); data1=0x10; //文本区宽度 data2=0x00; data3=0x41; Write1_Data(); Write2_Data(); Write_Code(); data3=0xa7; //设置光标的形状 Write_Code(); data1=0x0f; //光标指针,data1为列(00-0f),data2(00-07)为行,8*8框格 data2=0x07; data3=0x21; Write1_Data(); Write2_Data(); Write_Code(); data3=0x9f; Write_Code(); //启用图形和文本显示,光标闪烁 data3=0x81; Write_Code(); //字符发生器为CGRAM,显示方式为逻辑或 data1=0x00; //置地址指针位置,(*) data2=0x00; data3=0x24; Write1_Data(); Write2_Data(); Write_Code(); Clr_Lcd(); return; }
void Clr_Lcd() { unsigned int p=0,q=0,r=0; /*data1=0x03; //CGRAM偏置地址设置 data2=0x00; data3=0x22; Write1_Data(); Write2_Data(); Write_Code();*/ data2=0x00; data3=0x0b0; Write_Code(); //为自动写入状态 data1=0x2000; //清显示RAM 0000H-2000H(8K) while(data1-->0) { //Judge2_Ready(); Lcd_Delay1(); data2=0x0; Write2_Data(); } data1=0x00; //置地址指针位置,(*) data2=0x00; data3=0x24; Write1_Data(); Write2_Data(); Write_Code(); data1=0x2000; //写显示RAM 0000H-2000H(8K) while(data1-->0) { Lcd_Delay1(); data2=0x0ff; Write2_Data(); } data1=0x00; //置地址指针位置,(*) data2=0x00; data3=0x24; Write1_Data(); Write2_Data(); Write_Code(); data1=0x2000; //清显示RAM 0000H-2000H(8K) while(data1-->0) { Lcd_Delay1(); data2=0x0; Write2_Data(); } data3=0x0b2; Write_Code(); return; }
void Lcd_Delay() { unsigned int i=1; unsigned int j=1; while(i--) { while(j--){;} } }
void Lcd_Delay1() { unsigned int i=1; unsigned int j=100; while(i--) { while(j--){;} } }
void Judge1_Ready() { do { asm(" IN 8010h,_temp1 "); asm(" nop "); asm(" nop "); asm(" nop "); asm(" nop "); temp1=temp1&3; }while(temp1!=3); temp1=0; }
void Judge2_Ready() { do { asm(" IN 8010h,_temp2 "); asm(" nop "); asm(" nop "); asm(" nop "); asm(" nop "); temp2=temp2&8; }while(temp2!=8); temp2=0; }
void Write_Code() { //Judge1_Ready(); Lcd_Delay(); PEDATDIR=PEDATDIR | 0x2020; asm(" ldp #010h "); asm(" OUT 062h,8010h "); asm(" nop "); asm(" nop "); asm(" nop "); asm(" nop "); //Lcd_Delay(); return; }
void Write1_Data() { Lcd_Delay(); PEDATDIR=PEDATDIR | 0x2000; PEDATDIR=PEDATDIR & 0xFFDF; //Judge1_Ready(); asm(" ldp #010h "); asm(" OUT 060h,8000h "); asm(" nop "); asm(" nop "); asm(" nop "); asm(" nop "); //Lcd_Delay(); return; }
void Write2_Data() { Lcd_Delay(); PEDATDIR=PEDATDIR | 0x2000; PEDATDIR=PEDATDIR & 0xFFDF; //Judge1_Ready(); asm(" ldp #010h "); asm(" OUT 061h,8000h "); asm(" nop "); asm(" nop "); asm(" nop "); asm(" nop "); //Lcd_Delay(); return; }
void KickDog() /*踢除看门狗 */ { WDKEY=0x5555; WDKEY=0xAAAA; }
|