📄 利用lcd演示q格式运算.txt
字号:
/*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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -