📄 main.c
字号:
0x00,0x00,0x00,0xFE,0x10,0x52,0x32,0x34,0x14,0xFF,0x10,0x10,0x10,0x10,0x10,0x00,/*"平",16*/
0x00,0x00,0x00,0x08,0x7F,0x51,0x51,0x10,0x7F,0x24,0x24,0x34,0x08,0x16,0x60,0x00,/*"安",17*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"空格",18*/
};
// *********************************************** */
// **
// **
// *********************************************** */
// 此表为图形显示方式下(西文字符:8*8点阵数据)的字模 */
uint8 const CTAB_8_8[] ={
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
};
/*
*********************************************************************************************************
** 函数名称 :WRI_CC()
** 函数功能 :写入点阵数据子程序**
** 入口参数 : LCD_X(0-128),LCD_Y(0-8),CODE,dat8_16(其值表示:
** 1表示8*16点阵式数据,2表示16*16点阵数据即汉字写入,3表示8*8点阵数据)
** 出口参数 :无
*********************************************************************************************************
*/
void WRI_CC (uint8 x,uint8 y,uint8 cod,uint8 dat8_16)
{
uint8 m;
uint8 n;
uint16 i;
LCD_X = x;
LCD_Y = y;
CODE = cod;
n = dat8_16;
/* 写入汉字,16*16点阵数据 */
if(n == 2)
{
i = CODE * 0x18;
for(m=0;m<12;m++)
{
LCD_POS(LCD_X,LCD_Y);
LCD_WD(CCTAB[i]); // 写入上半部汉字数据
i++;
LCD_Y++;
LCD_POS(LCD_X,LCD_Y);
LCD_WD(CCTAB[i]); // 写入上半部汉字数据
i++;
LCD_Y--;
LCD_X ++;
}
}
/* 写入8*16点阵数据 */
if(n == 1)
{
i = CODE * 16;
for(m=0;m<8;m++)
{
LCD_POS(LCD_X,LCD_Y);
LCD_WD(CTAB_8_16[i]); // 写入上半部汉字数据
i++;
LCD_Y++;
LCD_POS(LCD_X,LCD_Y);
LCD_WD(CTAB_8_16[i]); // 写入上半部汉字数据
i++;
LCD_Y--;
LCD_X ++;
}
}
/* 写入8*8点阵数据 */
if(n == 3)
{
i = CODE * 8;
for(m=0;m<8;m++)
{
LCD_POS(LCD_X,LCD_Y);
LCD_WD(CTAB_8_8[i]); // 写入上半部汉字数据
i++;
LCD_X ++;
}
}
}
/*
*********************************************************************************************************
** 函数名称 :Kaiji_Dis_()
** 函数功能 :开机显示子程序**
** 入口参数 :
** 出口参数 :无
*********************************************************************************************************
*/
void Kaiji_Dis(void)
{
WRI_CC( 0,0,2,1);//2
WRI_CC( 8,0,0,1);//0
WRI_CC(15,0,0,1);//0
WRI_CC(23,0,7,1);//7
WRI_CC(31,0,5,2);//年
WRI_CC(43,0,1,1);//1
WRI_CC(51,0,6,2);//年
WRI_CC(63,0,1,1);//1
WRI_CC(71,0,7,2);//日
WRI_CC(0,2,1,1);//1
WRI_CC(8,2,2,1);//2
WRI_CC(16,2,10,1);//:
WRI_CC(24,2,0,1);//0
WRI_CC(32,2,0,1);//0
WRI_CC(40,2,10,1);//:
WRI_CC(48,2,0,1);//0
WRI_CC(56,2,0,1);//0
WRI_CC(80,2,8,2);//星
WRI_CC(96,2,9,2);//期
WRI_CC(112,2,11,2);//一
}
void AD_SET (void)
{uint32 ADC_Data;
PINSEL1 = 1 << 28; // P0.30连接到AD0.3
/* 进行ADC模块设置 */
AD0CR = (1 << 3) | // SEL=8,选择通道3
((Fpclk / 1000000 - 1) << 8) | // CLKDIV=Fpclk/1000000-1,转换时钟为1MHz
(0 << 16) | // BURST=0,软件控制转换操作
(0 << 17) | // CLKS=0, 使用11clock转换
(1 << 21) | // PDN=1,正常工作模式
(0 << 22) | // TEST1:0=00,正常工作模式
(1 << 24) | // START=1,直接启动ADC转换
(0 << 27); // 直接启动ADC转换时,此位无效
AD0CR |= 1 << 24; // 进行第一次转换
while ((ADDR & 0x80000000) == 0); // 等待转换结束
AD0CR |= 1 << 24; // 再次启动转换
while ((AD0DR & 0x80000000) == 0); // 等待转换结束
ADC_Data = AD0DR; // 读取ADC结果
ADC_Data = (ADC_Data >> 6) & 0x3ff;
ADC_Data = ADC_Data * 2480; // 参考电压经过3/4分压
ADC_Data = ADC_Data / 1024;
WRI_CC(0,6,(ADC_Data / 1000),1);
// WRI_CC(0,6,(ADC_Data / 1000),1)
WRI_CC(8,6,(ADC_Data / 100),1);
WRI_CC(16,6,(ADC_Data / 10),1);
WRI_CC(24,6,(ADC_Data % 1),1) ;
}
/*
*********************************************************************************************************
** 函数名称 :
** 函数功能 :时间处理子程序**
** 入口参数 :
** 出口参数 :无
*********************************************************************************************************
*/
void YEAR_SET(void)
{ uint8 i;
DelayNS(1000);
for(i= 0;i<1;) //修改年
{
uint32 year;
if ((IO0PIN & KEY_B) == 0)
{
YEAR++;
}
if ((IO0PIN & KEY_C) == 0)
{
YEAR--;
}
if (YEAR ==2018)
{YEAR=2007;
}
WRI_CC(0,0,18,1);//
WRI_CC(8,0,18,1);//
WRI_CC(16,0,18,1);//
WRI_CC(24,0,18,1);//
DelayNS(200);
year= YEAR;
WRI_CC(0,0,(year / 1000),1);
year = year % 1000;
WRI_CC(8,0,(year / 100),1);//
year = year % 100;
WRI_CC(16,0,(year / 10),1);//
WRI_CC(24,0,(year % 10),1);//
DelayNS(200);
if ((IO0PIN & KEY_A) == 0)
{
DelayNS(10);
if ((IO0PIN & KEY_A) == 0)
i=1;
}
}
}
void MOON_SET(void) //修改月份
{ uint8 i;
DelayNS(1000);
for(i= 0;i<1;)
{uint8 moon;
if ((IO0PIN & KEY_B) == 0)
{
MONTH++;
}
if ((IO0PIN & KEY_C) == 0)
{
MONTH--;
}
if (MONTH ==13)
{MONTH=0X00;
}
moon = MONTH; // 获取 月
WRI_CC(44,0,18,1);
WRI_CC(52,0,18,1);
DelayNS(200);
WRI_CC(44,0,(moon / 10),1);
WRI_CC(52,0,(moon % 10),1);
DelayNS(200);
if ((IO0PIN & KEY_A) == 0)
{
DelayNS(10);
if ((IO0PIN & KEY_A) == 0)
{
i=1;
}
}
}
}
void DAY_SET(void) //修改天
{ uint8 i;
DelayNS(1000);
for(i= 0;i<1;)
{uint8 day;
if ((IO0PIN & KEY_B) == 0)
{
DOM++;
}
if ((IO0PIN & KEY_C) == 0)
{
DOM--;
}
if (DOM ==32)
{DOM=1;
}
day = DOM; // 获取 日
WRI_CC(72,0,18,1);
WRI_CC(80,0,18,1);
DelayNS(200);
WRI_CC(72,0,(day / 10),1);
WRI_CC(80,0,(day % 10),1);
DelayNS(200);
if ((IO0PIN & KEY_A) == 0)
{
DelayNS(10);
if ((IO0PIN & KEY_A) == 0)
{
i=1;
}
}
}
}
void HOUR_SET(void)
{ uint8 i;
DelayNS(1000);
for(i= 0;i<1;)
{uint8 hour;
if ((IO0PIN & KEY_B) == 0)
{
HOUR++;
}
if ((IO0PIN & KEY_C) == 0)
{
HOUR--;
}
if (HOUR ==24)
{HOUR=0X00;
}
hour = HOUR; // 获取 小时
WRI_CC(0,2,18,1);
WRI_CC(8,2,18,1);
DelayNS(200);
WRI_CC(0,2,(hour / 10),1);
WRI_CC(8,2,(hour % 10),1);
DelayNS(200);
if ((IO0PIN & KEY_A) == 0)
{
DelayNS(10);
if ((IO0PIN & KEY_A) == 0)
{
i=1;
}
}
}
}
void MIN_SET(void)
{ uint8 i;
DelayNS(1000);
for(i= 0;i<1;)
{uint8 min;
if ((IO0PIN & KEY_B) == 0)
{
MIN++;
}
if ((IO0PIN & KEY_C) == 0)
{
MIN--;
}
if (MIN ==60)
{MIN=0X00;
}
WRI_CC(24,2,18,1);
WRI_CC(32,2,18,1);
DelayNS(200);
min = MIN; // 获取 分
WRI_CC(24,2,(min / 10),1);
WRI_CC(32,2,(min % 10),1);
DelayNS(200);
if ((IO0PIN & KEY_A) == 0)
{
DelayNS(10);
if ((IO0PIN & KEY_A) == 0)
{
i=1;
}
}
}
} // 启动RTC
void WEEK_SET(void)
{ uint8 i;
DelayNS(1000);
for(i= 0;i<1;)
{uint8 dow;
if ((IO0PIN & KEY_B) == 0)
{
DOW++;
}
if ((IO0PIN & KEY_C) == 0)
{
DOW--;
}
if (DOW ==7)
{DOW= 0;
}
WRI_CC(112,2,18,1);
WRI_CC(120,2,18,1);
DelayNS(200);
dow = DOW; // 获取 分
if(DOW == 0 )
{
WRI_CC(112,2,7,2);
}
else
{
WRI_CC(112,2,(dow +10),2);//一
}
DelayNS(200);
if ((IO0PIN & KEY_A) == 0)
{
DelayNS(10);
if ((IO0PIN & KEY_A) == 0)
{
i=1;
}
}
}
}
void Time_set(void )
{
CCR = 0x00;
YEAR_SET();
MOON_SET();
DAY_SET();
HOUR_SET();
MIN_SET();
WEEK_SET();
// 启动RTC
CIIR = 0x01; // 设置秒值的增量产生1次中断
//AMR = 0xFF; // 所有报警都被屏蔽
ILR = 0x03; // 清除RTC增量和报警中断标志
CCR = 0x11;
}
void Key_Scan(void)
{
//
if ((IO0PIN & KEY_A) == 0)
{
DelayNS(2000);
if ((IO0PIN & KEY_A) == 0)
{
Time_set();
}
}
}
/*
*********************************************************************************************************
** 函数名称 :main()
** 函数功能 :实现数字时钟功能
*********************************************************************************************************
*/
int main (void)
{
PINSEL0 = 0x00000000;
IO0DIR = 0X0007FFFF;
PLLCON = 1; // 使能PLL
PLLCFG = 0x40; // 设置M为6,P为2
PLLFEED = 0xaa; // 发送PLL馈送序列
PLLFEED = 0x55;
while((PLLSTAT & (1 << 10)) == 0); // 等待PLL锁定
PLLCON = 3; // PLL使能和连接
PLLFEED = 0xaa; // 发送PLL馈送序列
PLLFEED = 0x55;
/***********************************/
// IO0SET = BEEP;
/***********************************/
/* LCD is inited */
INI(); //LCD初始化
Kaiji_Dis(); //显示2007年1月1日 12
// AD_SET();
IRQEnable(); // IRQ中断使能
RTCInt();
while(1)
{
VIC_Init();
AD_SET();
Key_Scan();
}
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -