📄 main.c
字号:
/*flashman编写,QQ28479691,欢迎交流*/
#include "config.h"
#define rs (1<<8)
#define rw (1<<9)
#define en (1<<10)
#define busy (1<<7)
uint8 BCD[6]; //十位二进制的显示码分别是千百十个位的显示
uint8 txt[]={"flashman"};
uint16 count=0;
__inline void enable_irq()
{
uint8 tmp;
__asm
{
MRS tmp,CPSR
BIC tmp,tmp,#0x80
MSR CPSR_c,tmp
}
}
__inline void disable_irq()
{
uint8 tmp;
__asm
{
MRS tmp,CPSR
ORR tmp,tmp,#0x80
MSR CPSR_c,tmp
}
}
__inline void enable_frq()
{
uint8 tmp;
__asm
{
MRS tmp,CPSR
BIC tmp,tmp,#0x40
MSR CPSR_c,tmp
}
}
__inline void disable_frq()
{
uint8 tmp;
__asm
{
MRS tmp,CPSR
ORR tmp,tmp,#0x40
MSR CPSR_c,tmp
}
}
void delay(uint32 dly);
void timer0_init(void);
void __irq tInt(void);
void int_init(void);
void ChkBusy(void);
void WrOp(uint8 dat);
void WrDat(uint8 dat); //读数据
void lcd_init(void);
void DisText(uint8 addr,uint8 *p);
void ShowInt(uint8 addr,uint16 num); //在addr处显示数字num
void ShowByte(uint8 addr,uint8 num);
/****************************************************/
int main(void)
{
IODIR=0xffff; //设置为输出
IOCLR=0xffff;
lcd_init();
ShowInt(0x80,count++);
int_init();
timer0_init();
enable_irq();
while(1);
}
/**************************************************/
void delay(uint32 dly)
{ uint32 i;
for(; dly>0; dly--)
for(i=0; i<500; i++);
}
void timer0_init(void)
{//定时器计数器0设置,晶振为12M,1秒要运行1000000个周期,
T0PR=1000; //预分频寄存器
T0MR0=1000; //匹配值
T0MCR=0x00000003; //开放匹配0中断
T0TCR=0x00000003; //T0PC和T0TC复位
T0TCR=0x00000001; //T0PC和T0TC复位
}
void __irq tInt(void)
{//中断处理程序
ShowInt(0x80,count++);
VICVectAddr=0;
T0IR=0x00000001;
}
void int_init(void)
{//中断设置
VICIntSelect=0x00000000;
VICIntEnable=0x00000010;
VICVectCntl0=0x00000024;
VICVectAddr0=(int)tInt;
}
/********************LCD程序********************************/
void ChkBusy()
{
IODIR=0xff00;
while(1)
{
IOCLR=rs;
IOSET=rw;
IOSET=en;
if(!(IOPIN & busy))break;
IOCLR=en;
}
IODIR=0xffff;
}
void WrOp(uint8 dat)
{
ChkBusy();
IOCLR=rs; //全部清零
IOCLR=rw;
IOCLR=0xff; //先清零
IOSET=dat; //再送数
IOSET=en;
IOCLR=en;
}
void WrDat(uint8 dat) //读数据
{
ChkBusy();
IOSET=rs;
IOCLR=rw;
IOCLR=0xff; //先清零
IOSET=dat; //再送数
IOSET=en;
IOCLR=en;
}
void lcd_init(void)
{
WrOp(0x38);
WrOp(0x06); //光标加1
WrOp(0x0c); //开显示
}
void DisText(uint8 addr,uint8 *p)
{
WrOp(addr);
while(*p !='\0')WrDat(*(p++));
}
void ShowInt(uint8 addr,uint16 num) //在addr处显示数字num
{//将num转化成五个BCD码存放在全局数组BCD[5]中
uint8 i;
for(i=5;i>0;i--) //将NUM数据转化成ASCII码,如521会转化为00521
{
BCD[i-1]=(uint8)(num%10+0x30); //取出最低位
num/=10; //去掉最低位
}
i=0;
while(BCD[i] ==0x30 && i<4) BCD[i++]=' '; //NUM转换成数组存放,但还没有加上小数点
BCD[5]='\0';
DisText(addr,BCD);
}
void ShowByte(uint8 addr,uint8 num)
{//将num转化成五个BCD码存放在全局数组BCD[5]中
uint8 i;
for(i=3;i>0;i--) //将NUM数据转化成ASCII码,如521会转化为00521
{
BCD[i-1]=(uint8)(num%10+0x30); //取出最低位
num/=10; //去掉最低位
}
i=0;
while(BCD[i] ==0x30 && i<2) BCD[i++]=' '; //NUM转换成数组存放,但还没有加上小数点
BCD[3]='\0';
DisText(addr,BCD);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -