📄 main.cpp
字号:
#include <msp430x22x4.h>
#define CPU_F ((double)8000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
#define sce1 P1OUT|=BIT0; //片选
#define sce0 P1OUT&=~BIT0; //片选
#define res1 P1OUT|=BIT1; //复位,0复位
#define res0 P1OUT&=~BIT1;
#define dc1 P1OUT|=BIT2; //1写数据,0写指令
#define dc0 P1OUT&=~BIT2;
#define sdin1 P1OUT|=BIT3; //数据
#define sdin0 P1OUT&=~BIT3;
#define sclk1 P1OUT|=BIT4; //时钟
#define sclk0 P1OUT&=~BIT4;
unsigned char hour=12,min=0,sec=0,counter=0;
unsigned char dis_buf[6];
unsigned int a[6];
unsigned char zimu[]={
/*-- 文字: 0 --*/
/*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*/
/*-- 高度不是8的倍数,现调整为:宽度x高度=6x16 --*/
0xF8,0x04,0x04,0x04,0xF8,0x00,0x01,0x02,0x02,0x02,0x01,0x00,
/*-- 文字: 1 --*/
/*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*/
/*-- 高度不是8的倍数,现调整为:宽度x高度=6x16 --*/
0x00,0x08,0xFC,0x00,0x00,0x00,0x00,0x02,0x03,0x02,0x00,0x00,
/*-- 文字: 2 --*/
/*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*/
/*-- 高度不是8的倍数,现调整为:宽度x高度=6x16 --*/
0x18,0x84,0x44,0x24,0x18,0x00,0x03,0x02,0x02,0x02,0x02,0x00,
/*-- 文字: 3 --*/
/*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*/
/*-- 高度不是8的倍数,现调整为:宽度x高度=6x16 --*/
0x08,0x04,0x24,0x24,0xD8,0x00,0x01,0x02,0x02,0x02,0x01,0x00,
/*-- 文字: 4 --*/
/*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*/
/*-- 高度不是8的倍数,现调整为:宽度x高度=6x16 --*/
0x40,0xB0,0x88,0xFC,0x80,0x00,0x00,0x00,0x00,0x03,0x02,0x00,
/*-- 文字: 5 --*/
/*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*/
/*-- 高度不是8的倍数,现调整为:宽度x高度=6x16 --*/
0x3C,0x24,0x24,0x24,0xC4,0x00,0x01,0x02,0x02,0x02,0x01,0x00,
/*-- 文字: 6 --*/
/*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*/
/*-- 高度不是8的倍数,现调整为:宽度x高度=6x16 --*/
0xF8,0x24,0x24,0x2C,0xC0,0x00,0x01,0x02,0x02,0x02,0x01,0x00,
/*-- 文字: 7 --*/
/*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*/
/*-- 高度不是8的倍数,现调整为:宽度x高度=6x16 --*/
0x0C,0x04,0xE4,0x1C,0x04,0x00,0x00,0x00,0x03,0x00,0x00,0x00,
/*-- 文字: 8 --*/
/*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*/
/*-- 高度不是8的倍数,现调整为:宽度x高度=6x16 --*/
0xD8,0x24,0x24,0x24,0xD8,0x00,0x01,0x02,0x02,0x02,0x01,0x00,
/*-- 文字: 9 --*/
/*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*/
/*-- 高度不是8的倍数,现调整为:宽度x高度=6x16 --*/
0x38,0x44,0x44,0x44,0xF8,0x00,0x00,0x03,0x02,0x02,0x01,0x00,
/*-- 文字: : --*/
/*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*/
/*-- 高度不是8的倍数,现调整为:宽度x高度=6x16 --*/
0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
/*-- 文字: --*/
/*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*/
/*-- 高度不是8的倍数,现调整为:宽度x高度=6x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
unsigned char hanzi[]=
{
/*-- 文字: 时 --*/
/*-- 宋体9; 此字体下对应的点阵为:宽x高=12x12 --*/
/*-- 高度不是8的倍数,现调整为:宽度x高度=12x16 --*/
0xFE,0x22,0x22,0xFE,0x04,0x14,0x64,0x04,0xFF,0x04,0x04,0x00,0x03,0x01,0x01,0x03,
0x00,0x00,0x04,0x04,0x07,0x00,0x00,0x00,
/*-- 文字: 间 --*/
/*-- 宋体9; 此字体下对应的点阵为:宽x高=12x12 --*/
/*-- 高度不是8的倍数,现调整为:宽度x高度=12x16 --*/
0xFC,0x01,0x02,0xF8,0x29,0x29,0x29,0xF9,0x01,0xFF,0x00,0x00,0x07,0x00,0x00,0x01,
0x01,0x01,0x01,0x01,0x04,0x07,0x00,0x00,
};
/*--------------------------------------------
LCD_write_byte: 使用SPI接口写数据到LCD
输入参数:dt:写入的数据;
command :写数据/命令选择;
编写日期:20080918
----------------------------------------------*/
void LCD_write_byte(unsigned char dt, unsigned char command)
{
unsigned char i;
sce0;
if(command==1)
{dc1; }
else {dc0;}
for(i=0;i<8;i++)
{
if(dt&0x80)
{sdin1;}
else
{sdin0;}
dt=dt<<1;
sclk0;
sclk1;
}
dc1;
sce1;
sdin1;
}
/*---------------------------------------
LCD_init: 3310LCD初始化
编写日期:20080918
----------------------------------------- */
void LCD_init(void)
{
res0;
delay_ms(1);
res1;
LCD_write_byte(0x21,0);//初始化Lcd,功能设定使用扩充指令
LCD_write_byte(0xd0,0);//设定液晶偏置电压
LCD_write_byte(0x20,0);//使用基本指令
LCD_write_byte(0x0C,0);//设定显示模式,正常显示
}
/*-------------------------------------------
LCD_set_XY: 设置LCD坐标函数
输入参数:X:0-83 Y:0-5
编写日期:20080918
---------------------------------------------*/
void LCD_set_XY(unsigned char X, unsigned char Y)
{
LCD_write_byte(0x40 | Y, 0);// column
LCD_write_byte(0x80 | X, 0);// row
}
/*------------------------------------------
LCD_clear: LCD清屏函数
编写日期:20080918
--------------------------------------------*/
void LCD_clear(void)
{
unsigned char t;
unsigned char k;
LCD_set_XY(0,0);
for(t=0;t<6;t++)
{
for(k=0;k<84;k++)
{
LCD_write_byte(0x00,1);
}
}
}
/*---------------------------------------------
LCD_write_shu: 显示8(宽)*16(高)点阵列数字字母符号等半角类
输入参数:c:显示的字符;
编写日期:20080918
-----------------------------------------------*/
void LCD_write_shu(unsigned char row, unsigned char page,unsigned char c) //row:列 page:页 dd:字符
{
unsigned char i;
LCD_set_XY(row*6, page);// 列,页
for(i=0; i<6;i++)
{
LCD_write_byte(zimu[c*12+i],1);
}
LCD_set_XY(row*6, page+1);// 列,页
for(i=6; i<12;i++)
{
LCD_write_byte(zimu[c*12+i],1);
}
}
/*---------------------------------------------
LCD_write_hanzi: 显示12(宽)*16(高)点阵列汉字等半角类
输入参数:c:显示的字符;
编写日期:20080918
-----------------------------------------------*/
void LCD_write_hanzi(unsigned char row, unsigned char page,unsigned char c) //row:列 page:页 dd:字符
{
unsigned char i;
LCD_set_XY(row*6, page);// 列,页
for(i=0; i<12;i++)
{
LCD_write_byte(hanzi[c*24+i],1);
}
LCD_set_XY(row*6, page+1);// 列,页
for(i=12; i<24;i++)
{
LCD_write_byte(hanzi[c*24+i],1);
}
}
void shijianjishuan()
{
if(counter==160)
{
counter=0;
sec++;
if(sec==60)
{
sec=0;
min++;
if(min==60)
{
min=0;
hour++;
if(hour==24)
hour=0;
}
}
}
dis_buf[0] = hour / 10; // 时十位
dis_buf[1] = hour % 10; // 时个位
dis_buf[2] = min / 10; // 分十位
dis_buf[3] = min % 10; // 分个位
dis_buf[4] = sec / 10; // 秒十位
dis_buf[5] = sec % 10; // 秒个位
}
void panduanqueren()
{
if(!(P3IN&BIT4))//开关1按下情况下,分别按开关2,开关3,开关4调节时,分,秒
{
delay_ms(10);
if(!(P3IN&BIT4))
{
counter=0;
if(!(P3IN&BIT6))
{
delay_ms(10);
if(!(P3IN&BIT6))
{
while(!(P3IN&BIT6));
sec++;
if(sec > 59)
{
sec = 0;
}
}
}
if(!(P3IN&BIT7))
{
delay_ms(10);
if(!(P3IN&BIT7))
{
while(!(P3IN&BIT7));
min++;
if(min > 59)
{
min = 0;
}
}
}
if(!(P3IN&BIT5))
{
delay_ms(10);
if(!(P3IN&BIT5))
{
while(!(P3IN&BIT5));
hour++;
if(hour > 23)
{
hour = 0;
}
}
}
}
}
}
void init()
{
WDTCTL = WDTPW + WDTHOLD;
DCOCTL=CALDCO_8MHZ;
BCSCTL1=CALBC1_8MHZ;
P1DIR=0XFF;
P3REN|=BIT4+BIT5+BIT6+BIT7;
P3OUT|=BIT4+BIT5+BIT6+BIT7;
P3DIR&=~(BIT4+BIT5+BIT6+BIT7);
res0;
delay_us(100);
res1;
LCD_init(); //初始化LCD模块
LCD_clear(); //清屏幕
TACTL=TASSEL1+TACLR; //定时器A时钟源为SMCLK,并清TAR
CCTL0 |=CCIE; //CCR0中断使能
CCR0 =50000; //计数值为50000个SMCLK周期
TACTL |=MC1; //启动定时器A为连续计数模式
_EINT();
LCD_write_hanzi(0,2,0);//时
LCD_write_hanzi(2,2,1);//间
LCD_write_shu(8,2,10);
LCD_write_shu(11,2,10);
}
main()
{
init();
while(1)
{
panduanqueren();
shijianjishuan();
LCD_write_shu(6,2,dis_buf[0]);
LCD_write_shu(7,2,dis_buf[1]);
LCD_write_shu(9,2,dis_buf[2]);
LCD_write_shu(10,2,dis_buf[3]);
LCD_write_shu(12,2,dis_buf[4]);
LCD_write_shu(13,2,dis_buf[5]);
}
}
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
counter++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -