📄 main.c
字号:
#include "SPCE061A.h"
#define lcd1602_rs_high 0x0100
#define lcd1602_rs_low 0xfeff
#define lcd1602_rw_high 0x0200
#define lcd1602_rw_low 0xfdff
#define lcd1602_e_high 0x0400
#define lcd1602_e_low 0xfbff
unsigned char string[]=" Digital Clock";
unsigned char hour=0,minute=0,second=0,clockcount=0;
void main(void)
{
__asm("INT OFF");
*P_INT_Ctrl=C_IRQ5_2Hz;
*P_IOA_Dir=0xffff;
*P_IOA_Attrib=0xffff;
*P_IOA_Data=0xffff;
initial_lcd1602();
write_lcd1602_string(0x0081,string);
displayclock(0x00c4,hour);
write_lcd1602_data(0x003a);
displayclock(0x00c7,minute);
write_lcd1602_data(0x003a);
displayclock(0x00ca,second);
__asm("int IRQ");
while(1)
{*P_Watchdog_Clear=0x0001;}
}
void checkbusy_lcd1602(void)
{
*P_IOA_Dir=0xff7f;
*P_IOA_Attrib=0xffff;
*P_IOA_Data=0xffff;
*P_IOA_Buffer=*P_IOA_Buffer|0x00ff;
*P_IOA_Buffer=*P_IOA_Buffer&lcd1602_rs_low;
*P_IOA_Buffer=*P_IOA_Buffer&lcd1602_e_low;
*P_IOA_Buffer=*P_IOA_Buffer|lcd1602_rw_high;
*P_IOA_Buffer=*P_IOA_Buffer|lcd1602_e_high;
delay(10);
while(*P_IOA_Data&0x0080)
{
*P_Watchdog_Clear=0x0001;
}
*P_IOA_Buffer=*P_IOA_Buffer&lcd1602_e_low;
*P_IOA_Dir=0xffff;
}
void write_lcd1602_instruction(unsigned int i)
{
checkbusy_lcd1602();
*P_Watchdog_Clear=0x0001;
*P_IOA_Buffer=*P_IOA_Buffer&lcd1602_e_low;
*P_IOA_Buffer=*P_IOA_Buffer&lcd1602_rw_low;
*P_IOA_Buffer=*P_IOA_Buffer&lcd1602_rs_low;
*P_IOA_Buffer=*P_IOA_Buffer|lcd1602_e_high;
*P_IOA_Buffer=(*P_IOA_Buffer&0xff00)|i;
*P_IOA_Buffer=*P_IOA_Buffer&lcd1602_e_low;
}
void write_lcd1602_data(unsigned int i)
{
checkbusy_lcd1602();
*P_Watchdog_Clear=0x0001;
*P_IOA_Buffer=*P_IOA_Buffer&lcd1602_e_low;
*P_IOA_Buffer=*P_IOA_Buffer&lcd1602_rw_low;
*P_IOA_Buffer=*P_IOA_Buffer|lcd1602_rs_high;
*P_IOA_Buffer=*P_IOA_Buffer|lcd1602_e_high;
*P_IOA_Buffer=(*P_IOA_Buffer&0xff00)|i;
*P_IOA_Buffer=*P_IOA_Buffer&lcd1602_e_low;
}
void write_lcd1602_string(unsigned int x,unsigned *p)
{
write_lcd1602_instruction(x);
while(*p!=0x0000)
{
*P_Watchdog_Clear=0x0001;
write_lcd1602_data(*p);
p++;
if(x++==0x008f)
{
write_lcd1602_instruction(0x00c0);
}
}
}
void cls(void)
{
write_lcd1602_instruction(0x0001);
}
void initial_lcd1602(void)
{
write_lcd1602_instruction(0x0038);
delay(100);
write_lcd1602_instruction(0x000c);
delay(100);
write_lcd1602_instruction(0x0006);
write_lcd1602_instruction(0x0001);
}
void delay(unsigned int i)
{
*P_Watchdog_Clear=0x0001;
while(i--!=0x0000);
}
void IRQ5(void)__attribute__((ISR));
void IRQ5(void)
{
if(*P_INT_Ctrl&C_IRQ5_2Hz)
{
*P_INT_Clear=C_IRQ5_2Hz;
clockcount++;
if (clockcount==1)
{
write_lcd1602_instruction(0x00c6);
write_lcd1602_data(0x0020);
write_lcd1602_instruction(0x00c9);
write_lcd1602_data(0x0020);
}
if (clockcount==2)
{
write_lcd1602_instruction(0x00c6);
write_lcd1602_data(0x003a);
write_lcd1602_instruction(0x00c9);
write_lcd1602_data(0x003a);
clockcount=0;
if (second!=59)
{
second++;
displayclock(0x00ca,second);
}
else
{
second=0;
displayclock(0x00ca,second);
if(minute!=59)
{
minute++;
displayclock(0x00c7,minute);
}
else
{
minute=0;
displayclock(0x00c7,minute);
if(hour!=23)
{
hour++;
displayclock(0x00c4,hour);
}
else
{
hour=0;
displayclock(0x00c4,hour);
}
}
}
}
}
else
{
*P_INT_Clear=C_IRQ5_4Hz;
}
}
void displayclock(unsigned int x,unsigned char y)
{
write_lcd1602_instruction(x);
write_lcd1602_data(y/10+48);
write_lcd1602_data(y%10+48);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -