📄 main.c
字号:
/*********************************************************************************************************
(1) lcd定义:P0.0~P0.7 数据总线 P0.8=D/I P0.9=R/W;
P0.10=E; P0.11=CS1 P0.12=CS2 P0.13=RES
(2) 时钟
(3) ADC
********************************************************************************************************/
#include "config.h"
uint8 CODE; // LCD的汉字 字符代码 单元
uint8 LCD_X; // LCD的X座标
uint8 LCD_Y; // LCD的Y座标
uint8 COUNT; // LCD显示的字符个数,若是汉字,则需要四个字节字符
//uint8 cursor_Flag; // LCD的光标标志,1显示光
uint8 Dis_Page; // LCD的显示页码
/***********************************************************************************************
***********************************************************************************************
**************************************** TIME *************************************************
***********************************************************************************************/
typedef struct My_calendar
{
uint16 year;
uint8 month;
uint8 date;
uint8 week;
uint8 hour;
uint8 minute;
uint8 second;
uint8 temp;
}Calendar;
/*******函数声明*******/
void WRI_CC (uint8 x,uint8 y,uint8 cod,uint8 dat8_16);
//( uint8 x为X坐标 uint8 Y为Y坐标 uint8 cod 为数字 dat8_16为字型选择
/*
********************************************************************************************************
** 函数名称 : RTC_Int()
** 功能描述 : RTC中断服务函数。
** 入口参数 :无
** 出口参数 :无
*******************************************************************************************************
*/
void __irq RTC_Int(void)
{
uint32 datas;
uint32 times;
uint32 bak;
if ((IO0SET & BEEP) == 0)
IO0SET = BEEP; /* 关闭BEEP */
else
IO0CLR = BEEP;
times = CTIME0;
datas = CTIME1;
bak = (datas >> 16) & 0xfff;// 获取 年
WRI_CC(0,0,(bak / 1000),1);//2
bak = bak % 1000;
WRI_CC(8,0,(bak / 100),1);//0
bak = bak % 100;
WRI_CC(16,0,(bak / 10),1);//0
WRI_CC(24,0,(bak % 10),1);//7
WRI_CC(32,0,5,2);//年
bak = (datas >> 8) & 0x0f; // 获取 月
WRI_CC(44,0,(bak / 10),1);
WRI_CC(52,0,(bak % 10),1);
WRI_CC(60,0,6,2);// 重新写"月"
bak = datas & 0x1f; // 获取 日
WRI_CC(72,0,(bak / 10),1);
WRI_CC(80,0,(bak % 10),1);
WRI_CC(88,0,7,2);// 重新写"日"
bak = (times >> 16) & 0x1f; // 获取 小时
WRI_CC(0,2,(bak / 10),1);
WRI_CC(8,2,(bak % 10),1);
WRI_CC(16,2,10,1);//:
bak = (times >> 8) & 0x3f; // 获取 分钟
WRI_CC(24,2,(bak / 10),1);
WRI_CC(32,2,(bak % 10),1);
WRI_CC(40,2,10,1);//:
bak = times & 0x3f; // 获取 秒钟
WRI_CC(48,2,(bak / 10),1);
WRI_CC(56,2,(bak % 10),1);
WRI_CC(64,2,10,1);//:
bak = (times >> 24) & 0x07; // 获取 星期
if(bak == 0 )
{
WRI_CC(112,2,7,2);
}
else
{
WRI_CC(112,2,(bak +10),2);//一
}
//WRI_CC(11,73,2,1);//2
//WRI_CC(12,73,5,1);//5
//WRI_CC(13,73,10,2);//℃
ILR = 0x01; // 清除RTC增量中断标志
VICVectAddr = 0; // 向量中断结束
}
/*
*********************************************************************************************************
** 函数名称 :IRQ_Timer0()
** 函数功能 :定时器0中断服务程序,取反LED9控制口。
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************
*/
void IRQ_Timer0 (void)__irq
{
uint8 i;
Dis_Page--;
if(Dis_Page < 19)
{
for(i = (Dis_Page+1);i<20;i++)
WRI_CC(i,0,18,1);
}
if(Dis_Page == 25) WRI_CC(0,0,18,1);
if(Dis_Page == 0) Dis_Page = 26;
T0IR = 0x01; /* 清除中断标志 */
VICVectAddr = 0x00; /* 通知VIC中断处理结束 */
}
/*
*******************************************************************************************************
** 函数名称 :VIC_Init()
** 函数功能 :初始化VIC
** 入口参数 :无
** 出口参数 :无
*******************************************************************************************************
*/
void VIC_Init(void)
{
VICIntSelect = 0x00; // 设置所有中断连接IRQ中断
/* 设置RTC中断IRQ */
VICVectCntl1 = 0x20 | 13; // 分配通道0
VICVectAddr1 = (int)RTC_Int;// 设置中断服务程序地址
//VICDefVectAddr = (uint32)RTC_Int;
//VICIntEnable = (1 << 13); // 使能RTC中断
/* 设置定时器0中断IRQ */
VICVectCntl0 = 0x20 | 0x04; /* 设置定时器0中断通道分配次优先级 */
VICVectAddr0 = (uint32)IRQ_Timer0; /* 设置中断服务程序地址 */
VICIntEnable = (1 << 0x04) | (1 << 13);/* 使能定时器0中断,RTC中断 */
}
/*
*******************************************************************************************************
** 函数名称 :RTCInit()
** 函数功能 :初始化实时时钟
** 入口参数 :无
** 出口参数 :无
*******************************************************************************************************
*/
void RTCInt (void)
{
CCR = 0x00; // 禁止时间计数器,RTC对连接在RTCX1 和RTCX2 两端的32kHz 振荡器信号进行计数
YEAR = 2007;
MONTH = 12;
DOM = 1;
DOW = 62;
HOUR = 15;
MIN = 25;
SEC = 50;
CIIR = 0x01; // 设置秒值的增量产生1次中断
//AMR = 0xFF; // 所有报警都被屏蔽
ILR = 0x03; // 清除RTC增量和报警中断标志
CCR = 0x11; // 启动RTC
}
/*
*********************************************************************************************************
** 函数名称 :DelayNS()
** 函数功能 :长软件延时
** 入口参数 :dly 延时参数,值越大,延时越久
** 出口参数 :无
*********************************************************************************************************
*/
void DelayNS (uint32 dly)
{
uint32 i;
for ( ; dly>0; dly--)
for (i=0; i<1000; i++);
}
void DelayUS (uint32 dly)
{
uint32 i;
for ( ; dly>0; dly--)
for (i=0; i<1; i++);
}
/*********************************************************************************************************
** 函数名称 :LCD_BESY
** 函数功能 :LCD的忙检测
** 入口参数 :IO0PIN P0.07
** 出口参数 :无 RS=L RW=H CS=H E=H
*********************************************************************************************************/
void LCD_BESY1(void)
{ IO0SET =0xff << 7;
IO0DIR =0X0003BFFF;
IO0CLR =LCD_RS;
IO0SET =LCD_RW;
IO0SET =LCD_CS1;
IO0SET =LCD_E;
while((IO0PIN&0x4000)==0x4000);
IO0DIR =0X0003FFFF;
IO0CLR=0Xff << 7;
IO0CLR =LCD_RW;
IO0CLR =LCD_E;
IO0CLR =LCD_CS1;
}
void LCD_BESY2(void)
{ IO0SET=0Xff << 7;
IO0DIR =0X0003BFFF;
IO0CLR =LCD_RS;
IO0SET =LCD_RW;
IO0SET =LCD_CS2;
IO0SET =LCD_E;
while((IO0PIN&0x4000)==0x4000);
IO0DIR =0X0003FFFF;
IO0CLR=0XFF << 7;
IO0CLR =LCD_RW;
IO0CLR =LCD_E;
IO0CLR =LCD_CS2;
}
/*********************************************************************************************************
** 函数名称 :LCD_WC
** 函数功能 :LCD的指令写入
** 入口参数 :DAT
** 出口参数 :无 RS=L RW=L CS=H E=H
*********************************************************************************************************/
void LCD_WC1(uint8 DAT)
{ LCD_BESY1();
IO0CLR =LCD_RS;
IO0CLR =LCD_RW;
IO0SET =LCD_CS1;
IO0SET = DAT << 7;
IO0SET =LCD_E;
DelayUS(1);
IO0CLR =LCD_E;
IO0CLR =LCD_CS1;
IO0CLR = 0xFF << 7;
}
void LCD_WC2(uint8 DAT)
{ LCD_BESY2();
IO0CLR =LCD_RS;
IO0CLR =LCD_RW;
IO0SET =LCD_CS2;
IO0SET = DAT << 7;
IO0SET =LCD_E;
DelayUS(1);
IO0CLR =LCD_E;
IO0CLR =LCD_CS2;
IO0CLR = 0xFF << 7;
}
/*********************************************************************************************************
** 函数名称 :LCD_WD
** 函数功能 :LCD的数据写入
** 入口参数 :DAT
** 出口参数 :无 RS=H RW=L CS=H E=H
*********************************************************************************************************/
void LCD_WD1(uint8 DAT)
{ LCD_BESY1();
IO0SET =LCD_RS;
IO0CLR =LCD_RW;
IO0SET =LCD_CS1;
IO0SET = DAT << 7;
IO0SET =LCD_E;
DelayUS(1);
IO0CLR =LCD_E;
IO0CLR =LCD_RS;
IO0CLR =LCD_CS1;
IO0CLR = 0xFF << 7;
}
void LCD_WD2(uint8 DAT)
{ LCD_BESY2();
IO0SET =LCD_RS;
IO0CLR =LCD_RW;
IO0SET =LCD_CS2;
IO0SET = DAT << 7;
IO0SET =LCD_E;
DelayUS(1);
IO0CLR =LCD_E;
IO0CLR =LCD_RS;
IO0CLR =LCD_CS2;
IO0CLR = 0xFF << 7;
}
void LCD_WD(uint8 DAT)
{
if((LCD_X)<64)
LCD_WD1(DAT);
else
LCD_WD2(DAT);
//设置地址页指针
}
/*********************************************************************************************************
** 函数名称 :LCD_POS
** 函数功能 :LCD的内部数据地址指针定位
** 入口参数 :LCD_X, LCD_Y
** 出口参数 :无
*********************************************************************************************************/
void LCD_POS(uint8 cmd_x, uint8 cmd_y)
{
cmd_x = (LCD_COL|LCD_X) ; // 计算显示RAM地址
{ if((LCD_X)<64)
LCD_WC1(cmd_x);
else
LCD_WC2(cmd_x);
}
//设置地址列指针
cmd_y = (LCD_PAGE|LCD_Y);
{ if((LCD_X)<64)
LCD_WC1(cmd_y);
else
LCD_WC2(cmd_y);
} //设置地址页指针
}
/*********************************************************************************************************
** 函数名称 :CLERA()
** 函数功能 :清屏
** 入口参数 :
** 出口参数 :无
*********************************************************************************************************
*/
void CLEAR(void)
{ for(LCD_Y=0;LCD_Y<8;LCD_Y++)
{ for(LCD_X=0;LCD_X<127;LCD_X++)
{LCD_POS(LCD_X,LCD_Y);
LCD_WD(0X00); // 写入上半部汉字数据
}
}
};
/*********************************************************************************************************
** 函数名称 :INT()
** 函数功能 :初始化设置子程序,主要是对显示区域的设置和显示方式的设置。
** 入口参数 :DAT1,DAT2
** 出口参数 :无
*********************************************************************************************************
*/
void INI(void)
{
IO0SET = LCD_RES;
LCD_WC1(LCD_ON);
LCD_WC2(LCD_ON);
LCD_WC1(LCD_STA);
LCD_WC2(LCD_STA);
CLEAR();
}
// *********************************************** */
// 此表为图形显示方式下(自定义字符,包括汉字)的字模 */
uint8 const CCTAB[] = {
/////////////////////////////////////////////////////////////////////////
// 汉字字模表 //
// 汉字库: 宋体12.dot 纵向取模下高位,数据排列:从左到右从上到下 //
/////////////////////////////////////////////////////////////////////////
// 数据表
0x44,0x04,0x24,0x08,0xFF,0x07,0x14,0x09,0x70,0x05,0x57,0x03,0x75,0x01,0x85,0x0F,0x75,0x01,0x57,0x03,0x70,0x05,0x00,0x09,
0x20,0x00,0x10,0x00,0xFC,0x0F,0x23,0x00,0x10,0x00,0x0C,0x00,0x07,0x00,0xFC,0x0F,0x24,0x01,0x24,0x01,0x26,0x01,0x24,0x01,
0x20,0x08,0x22,0x04,0xE4,0x03,0x00,0x04,0xF9,0x0B,0xA9,0x08,0xAB,0x08,0xFD,0x0B,0xAB,0x08,0xA9,0x0A,0xF9,0x0B,0x00,0x08,
0x10,0x00,0x11,0x00,0xF2,0x07,0x00,0x02,0x22,0x00,0x22,0x00,0xFE,0x0F,0x22,0x00,0x22,0x00,0xFF,0x07,0x02,0x08,0x00,0x0F,
0x10,0x02,0x10,0x02,0x35,0x01,0x55,0x05,0x95,0x08,0xF5,0x07,0x55,0x00,0x95,0x00,0x5F,0x01,0x30,0x02,0x10,0x06,0x10,0x02,
0x90,0x00,0x88,0x00,0x84,0x00,0xF3,0x00,0x92,0x00,0x92,0x00,0xFE,0x0F,0x92,0x00,0x92,0x00,0x93,0x00,0x92,0x00,0x82,0x00,
0x00,0x08,0x00,0x04,0x00,0x02,0xFF,0x01,0x49,0x00,0x49,0x00,0x49,0x04,0x49,0x08,0x49,0x08,0xFF,0x07,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x07,0x22,0x02,0x22,0x02,0x22,0x02,0x22,0x02,0x22,0x02,0xFF,0x07,0x02,0x00,0x00,0x00,
0x00,0x0A,0x00,0x09,0xFE,0x0A,0xAA,0x0A,0xAA,0x0A,0xEA,0x0F,0xAA,0x0A,0xAA,0x0A,0xAA,0x0A,0xBF,0x0A,0x82,0x08,0x00,0x08,
0x04,0x09,0xFF,0x05,0x54,0x03,0x54,0x01,0xFF,0x03,0x04,0x09,0x00,0x04,0xFE,0x03,0x92,0x00,0x92,0x04,0x92,0x08,0xFF,0x07,
0x00,0x00,0x06,0x00,0xF6,0x00,0xF8,0x01,0x04,0x02,0x02,0x04,0x02,0x04,0x02,0x04,0x04,0x02,0x0C,0x01,0x00,0x00,0x00,0x00,
0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x30,0x00,0x20,0x00,
0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x04,0x04,0x06,0x00,0x04,
0x00,0x04,0x02,0x04,0x22,0x04,0x22,0x04,0x22,0x04,0x22,0x04,0x22,0x04,0x22,0x04,0x32,0x04,0x23,0x04,0x02,0x06,0x00,0x04,
0x00,0x00,0xFE,0x0F,0x02,0x05,0x82,0x04,0x7E,0x04,0x02,0x04,0x02,0x04,0x7E,0x04,0x82,0x04,0x82,0x04,0xFF,0x0F,0x02,0x00,
0x02,0x08,0x02,0x08,0x22,0x08,0x22,0x08,0xE2,0x0F,0x3E,0x08,0x22,0x08,0x22,0x08,0xF2,0x0F,0x22,0x08,0x03,0x0C,0x02,0x08,
0x08,0x04,0x08,0x02,0x08,0x01,0xC8,0x00,0x29,0x00,0x0A,0x00,0x2C,0x00,0x48,0x00,0x88,0x00,0x08,0x01,0x0C,0x06,0x08,0x00
// 汉字表:
// 00操 01作 02通 03讯 04录 05 年 06月 07 日 08星 09 期 10 ℃ 11 一12 二 13 三 14四 15 五 16 六 17 日
} ;
// *********************************************** */
// **
// **
// *********************************************** */
// 此表为图形显示方式下(西文字符:8*16点阵数据)的字模 */
uint8 const CTAB_8_16[] = {
0xF8,0x07,0xFC,0x0F,0x04,0x09,0xC4,0x08,0x24,0x08,0xFC,0x0F,0xF8,0x07,0x00,0x00, // -0-
0x00,0x00,0x10,0x08,0x18,0x08,0xFC,0x0F,0xFC,0x0F,0x00,0x08,0x00,0x08,0x00,0x00, // -1-
0x08,0x0E,0x0C,0x0F,0x84,0x09,0xC4,0x08,0x64,0x08,0x3C,0x0C,0x18,0x0C,0x00,0x00, // -2-
0x08,0x04,0x0C,0x0C,0x44,0x08,0x44,0x08,0x44,0x08,0xFC,0x0F,0xB8,0x07,0x00,0x00, // -3-
0xC0,0x00,0xE0,0x00,0xB0,0x00,0x98,0x08,0xFC,0x0F,0xFC,0x0F,0x80,0x08,0x00,0x00, // -4-
0x7C,0x04,0x7C,0x0C,0x44,0x08,0x44,0x08,0xC4,0x08,0xC4,0x0F,0x84,0x07,0x00,0x00, // -5-
0xF0,0x07,0xF8,0x0F,0x4C,0x08,0x44,0x08,0x44,0x08,0xC0,0x0F,0x80,0x07,0x00,0x00, // -6-
0x0C,0x00,0x0C,0x00,0x04,0x0F,0x84,0x0F,0xC4,0x00,0x7C,0x00,0x3C,0x00,0x00,0x00, // -7-
0xB8,0x07,0xFC,0x0F,0x44,0x08,0x44,0x08,0x44,0x08,0xFC,0x0F,0xB8,0x07,0x00,0x00, // -8-
0x38,0x00,0x7C,0x08,0x44,0x08,0x44,0x08,0x44,0x0C,0xFC,0x07,0xF8,0x03,0x00,0x00, // -9-
0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,/*":",10*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,/*".",11*/
0x00,0x00,0x20,0x3F,0x22,0x74,0x54,0x54,0x5F,0x64,0x24,0x34,0x34,0x54,0x0C,0x00,/*"好",12*/
0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x18,0x14,0x24,0x22,0x42,0x01,0x00,/*"人",13*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"一",14*/
0x00,0x00,0x08,0x28,0x48,0x3F,0x48,0x48,0x88,0x3E,0x08,0x08,0x08,0x08,0x7F,0x00,/*"生",15*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -