📄 main.c
字号:
/*****************************************************************************/
/* 文 件 名: infrared.cmp */
/* 程序描述: 本程序为综合测试程序,对子板和母板的各个功能模块进行测试。 */
/* 硬件连接: 见<<程序使用说明>>。 */
/* 1、键盘扫描:PH0-PH7 口用来键盘中断扫描;其中PH0-PH3为中断输入 */
/* PH4-PH7用来扫描输出 */
/* 2、串口输入输出模块:PS2、PS3口分别作输入输出口 */
/* 3、液晶显示模块:PT口作数据传输端,PB口作数据控制端 */
/* 4、PWM模块:PP1作输出端以控制蜂鸣器或喇叭发出声音 */
/* 5、LED显示模块:PP4-PP7 和PJ6 PJ7作六个LED的显示输出端 */
/* 6、AD模块:PAD00作AD转换端,并将值送入第二个和第三个数码管显示 */
/* 第一个数码管显示"A"取"AD"中"A"的意思。 */
/* 7、数码管显示模块:PB0-PB3作位选,PA1-PA6作段选。 */
/* 8、时钟模块:用用modulus-dowm-counter每0.1秒中断一次来控制数码管*/
/* 第八段(DP)每秒闪耀一次。 */
/*****************************************************************************/
#include <hidef.h> /* common defines and macros */
#include <mc9s12dg128.h> /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"
//[以下为子程序源代码]
//[头文件]
#define LcdData PTT //Lcd显示数据传送口
#define LcdData_D DDRT //数据口方向寄存器
#define LcdCtrl PORTB //Lcd控制信号传送口
#define LcdCtrl_D DDRB //控制口方向寄存器
#define LcdRS 7 //Lcd寄存器选择信号PTB7
#define LcdRW 6 //读写信号接PTB6
#define LcdE 5 //Lcd使能信号接PTB5
//内部调用子程序
void SYS_init(void);
void Lcd_Command(unsigned char cmd); //命令执行子程序
void LcdInit(void); //Lcd初始化子程序
void lcdshow(unsigned char str[]);
void PWM_init(void);
void ATD_Init(void);
void SCI1Init(void);
//数码管显示编码
const unsigned char sgcode[20]={
0x3f,6,0x5b,0x4f,0x66,0x6d,0x7d,7,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,
0,0x40,0x49,0x66} ; //0-F black -,三 ,||
unsigned char lcdbuf[]="==>> http:/ /jsj.tjpu.edu.cn/mcu";
unsigned char dpbuf[4];
uchar msec=0;
void main(void){
uchar i,temp,sk2,k;
uint n;
SYS_init();
while(!(PORTAD0==0XFF));
PTJ_PTJ6=0; //灯亮 说明上述没有问题
while(!(PORTAD1==0XFF));
PTJ_PTJ7=0; //灯亮说明上述没有问题
for(k=0;k<32;k++){
SCI1DRL=lcdbuf[k];while(!SCI1SR1_TDRE); //将要发送的数据传送给SCI数据寄存器,等待发送数据寄存器为空
}
EnableInterrupts;
lcdshow((unsigned char *)lcdbuf);
//程序总循环入口
for(;;) {
for(i=0;i<4;i++){
PORTA=sgcode[dpbuf[i]]; //发送编码到LED
if(i==0&&msec<=15){
PORTA=sgcode[dpbuf[i]]+0x80;
}
switch(i){
case 0:PTH=0xfe;PORTB=1;break;
case 1:PTH=0xfd;PORTB=2;break;
case 2:PTH=0xfb;PORTB=4;break;
case 3:PTH=0xf7;PORTB=8;break;
}
//判断串行通信接口是否接收到数据 ,并发送收到的数据
for(n=600;n>0;n--) {
if(SCI1SR1_RDRF){ //等待接受数据寄存器满
sk2=SCI1DRL;SCI1DRL=sk2;
}
}
temp=0xff-(PTH|0x0f);
if(temp!=0){ //判断是否有键按下
switch(temp){
case 0x10:temp=0+i;break; //PTH4这行有键按下,键值为0、1、2、3
case 0x20:temp=4+i;break; //PTH5这行有键按下,键值为4、5、6、7
case 0x40:temp=8+i;break; //PTH6这行有键按下,键值为8、9、10、11
case 0x80:temp=12+i;break; //PTH7这行有键按下,键值为12、13、14、15
}
dpbuf[0]=temp; //将键值送到显示缓存
}
if(msec==30){
msec=0;
while(!ATD0STAT0_SCF); //等待转换完成
dpbuf[3]=10;
dpbuf[2]=(uchar)ATD0DR0L>>4;
dpbuf[1]=(uchar)ATD0DR0L&15;
}
}
}
}
void SYS_init(void){
DDRA=0XFF; //LED DATA
DDRB=0XFF; //LED SELECT ,LCD CONTROL;
DDRH=0X0F;
PERH=0XF0;
DDRS=0XF0;//0-3为串口,4-7用于输出
PTS=0xff;
DDRP=0XFF;
PTP=0X0F;
DDRK=0XFF;
PORTK=0XF0;
DDRJ=0XFF;
PTJ=0XFF;
DDRM=0XFF;
PTM=0XFF;
ATD1DIEN=0XFF; //作数字输入口
ATD0DIEN=0XFE; //除最低位为AD输入,其余作数字输入口
MCCTL=0xc7;
MCCNT=0xc530;
ATD_Init();
PWM_init();
SCI1Init();
LcdInit(); //调用Lcd初始化子程序
}
void SCI1Init(void){
SCI1BDL=156; //SCI baud rate=SCI module clock/16*SCIBD=9600
SCI1CR2=0x0c;//enables the SCI receiver and transmitter.
}
void ATD_Init(void){
ATD0CTL3=0b00001000;
ATD0CTL4=0b11100110;
ATD0CTL5=0b10100000;
ATD0CTL2=0b11000000;
}
void PWM_init(void){
//pwm0.pwm1
PWMCTL_CON01=1; //0和1联合成16位PWM;
PWMCAE_CAE1=0; //选择输出模式为左对齐输出模式
PWMCNT01 = 0; //计数器清零;
PWMPOL_PPOL1=1; //先输出高电平,计数到DTY时,反转电平
PWMPRCLK = 0; //clockA不分频; clockA=busclock;
PWMSCLA = 12; //对clock SA 进行24分频;pwm clock=clockA/24=1MHz;
PWMDTY01 = 1500; //高电平时间为1.5ms;
PWMPER01 = 20000; //周期20ms; 50Hz;
PWMCLK_PCLK1 = 1; //选择clock SA做时钟源;
PWME_PWME1 = 1; //开启PWM
}
void lcdshow(unsigned char str[])
{
unsigned char i;
// LcdInit(); //调用Lcd初始化子程序
//显示第1行16个字符
LcdCtrl&=~(1<<LcdRS); //RS、R/W=00,写指令
LcdCtrl&=~(1<<LcdRW);
Lcd_Command(0b10000000); //后7位为DDRAM地址0x00
LcdCtrl|=1<<LcdRS; //RS、R/W=10,写数据到DDRAM中
LcdCtrl&=~(1<<LcdRW);
for (i=0;i<16;i++) //逐个显示
Lcd_Command(str[i]);
//显示第2行16个字符
LcdCtrl&=~(1<<LcdRS); //RS、R/W=00,写指令
LcdCtrl&=~(1<<LcdRW);
Lcd_Command(0b11000000); //后7位为DDRAM地址0x40
LcdCtrl|=1<<LcdRS; //RS、R/W=10,写数据到DDRAM中
LcdCtrl&=~(1<<LcdRW);
for (i=16;i<32;i++) //逐个显示
Lcd_Command(str[i]);
}
/*LcdInit:初始化Lcd------------------------------------*
*功 能:初始化Lcd(HD44780),设置显示方式,清屏,AC自动+1 *
*参 数:无 *
*返 回:无 *
*-----------------------------------------------------*/
void LcdInit(void)
{
unsigned char i,j;
LcdData_D=0b11111111; //数据口为输出
LcdCtrl_D|=(1<<LcdE); //控制口低三位为输出
LcdCtrl_D|=(1<<LcdRS);
LcdCtrl_D|=(1<<LcdRW);
LcdCtrl|=(1<<LcdE); //E=1
LcdCtrl&=~(1<<LcdRS); //RS、R/W=00,写指令
LcdCtrl&=~(1<<LcdRW);
Lcd_Command(0b00111000); //8位数据接口,2行,5*7点阵
Lcd_Command(0b00001000); //关显示,关光标显示,不闪烁
Lcd_Command(0b00000001); //清屏
for(i=0;i<53;i++){
for(j=0;j<250;j++);
} //延时
Lcd_Command(0b00010100); //光标右移一个字符位,AC自
// 动加1
Lcd_Command(0b00001100); //开显示,关光标显示,不闪烁
}
/*Lcd_Command:执行给定的cmd命令------------------------*
*功 能:执行给定的cmd命令,且延时 *
*参 数:cmd:待执行的命令 *
*返 回:无 *
*-----------------------------------------------------*/
void Lcd_Command(unsigned char cmd)
{
unsigned char i;
for (i=0;i<200;i++); //等待
for (i=0;i<150;i++);
LcdData=cmd; //把指令码送到Lcd数据传送口
LcdCtrl|=(1<<LcdE); //Lcd开始接收数据
asm("NOP");
asm("NOP");
asm("NOP");
LcdCtrl&=~(1<<LcdE); //Lcd结束接收数据
for (i=0;i<200;i++); //等待
for (i=0;i<150;i++);
}
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt void interrupt_MCCNT(void) {
DisableInterrupts;
msec++;
MCFLG_MCZF=1;
EnableInterrupts;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -