📄 12232_demo.c
字号:
#include "reg52.h"
#include "intrins.h"
#include "absacc.h"
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
sbit LCD_CS=P1^0; //RS
sbit LCD_SID=P1^1; //RW
sbit LCD_CLK=P1^2; //E
sbit Speak =P1^3; //扬声器发声
sbit Step_A =P1^4; //步进电机连接
sbit Step_B =P1^5;
sbit Step_C =P1^6;
sbit Step_D =P1^7;
sbit ADC_EOC=P3^4;
/************************D/A,A/D转换模块************************/
uchar code tab_dac[]; //DAC0832正弦波
void DA_test(void); //向DAC0832写入数据
//bit AD_test(void); //向ADC0809写入数据
//void AD_OUT(void);
#define DA XBYTE[0xD000] //DAC0832片选信号0832CS接CS5
#define ADC_in0 XBYTE[0xC000] //DAC0809片选信号0809CS接CS4 INT0
//#define ADC_in1 XBYTE[0xC001] //DAC0809片选信号0809CS接CS4 INT1
//uchar xdata ADC_in0 _at_ 0xC000;
void AD_test(void); //向ADC0809写入数据
/************************键盘模块******************************/
/*========================= 管脚定义 ==================*/
sbit key_dat = P2^0; //串行数据传入74164,将串行数据转换为并行数据
sbit key_clk = P2^1; //为74164提供时钟脉冲
sbit key_A = P2^2; //A B C 接74138产生扫描码
sbit key_B = P2^3;
sbit key_C = P2^4;
sbit key_down1 = P2^5; //判断键盘S1--S8是否有键按下;
sbit key_down2 = P2^6; //判断键盘S9--S16是否有键按下;
void key_led(void); //键盘显示
void Send_data(uchar Sdata); //发送数据
/***********************点阵模块*******************************/
//16*16点阵显示程序:显示"南京邮电大学"
//行使用PNP-5401驱动,P1.0--1.7,P3.0-P3.7为行口,低电平选中, 用于选择地址
//P0.0-P0.7,P2.0-P2.7为列显示数据,低电平点亮
void demo(uchar *s1,uchar *s2);
uchar code NUPT1[];
uchar code NUPT2[];
/**********************蜂鸣器模块函数**************************/
void play(uchar del);//发声
void Play_dingdong(void);//发声叮咚
/*==============================================================*/
/*液晶屏12864模块部分定义*/
/*==============================================================*/
/*======================液晶屏地址定义==========================*/
char xdata LCD_WCMDL _at_ 0xE400;
char xdata LCD_WCMDR _at_ 0xE800;
char xdata LCD_WDATL _at_ 0xE500;
char xdata LCD_WDATR _at_ 0xE900;
char xdata LCD_RdStatusL _at_ 0xE600;
char xdata LCD_RdStatusR _at_ 0xEA00;
char xdata LCD_Keydata _at_ 0xF000;
/***********常用操作命令和参数定义***************/
#define DISPON 0x3f /*显示on */
#define DISPOFF 0x3e /*显示off */
#define DISPFIRST 0xc0 /*显示起始行定义 */
#define SETX 0x40 /*X定位设定指令(页) */
#define SETY 0xb8 /*Y定位设定指令(列) */
#define Lcdbusy 0x80 /*LCM忙判断位 */
/**************显示分区边界位置*****************/
#define LCMLIMIT 0x80 /*显示区的右边界 */
/****************全局变量定义*******************/
uchar col,row,cbyte; /*列x,行(页)y,输出数据 */
/*****************函数列表**********************/
void Lcminit(void); /*液晶模块初始化 */
void WrdataL(uchar); /*数据输出给LCM */
void WrdataR(uchar); /*数据输出给LCM */
void Lcmcls( void ); /*LCM全屏幕清零(填充0) */
void LocatexyL(void); /*光标定位 */
void LocatexyR(void); /*光标定位 */
void WrcmdL(uchar); /*左区命令输出 */
void WrcmdR(uchar); /*右区命令输出 */
void Putpicture(unsigned char code*pC);
void Putdword(unsigned char code*pC,int i,int j);
/******************数组列表*********************/
/*ASCII常规字符点阵码表 */
uchar code nan[];
uchar code jing[];
uchar code you[];
uchar code dian[];
uchar code da[];
uchar code xue[];
uchar code NUPT[];
/*================================================================*/
/*12232主机部分定义*/
/*======================通用函数================================*/
void delay(uint ms); //延时函数
void LCD_WriteCmd (uchar cmd); //写指令
void LCD_WriteDat (uchar dat); //写数据
void LCD_init(void); //液晶屏初始化
void LCD_WriteHanzi (uint *hanzi); //写汉字
void LCD_WriteStr(uint *Str ,uchar num); //写字串(中英)
uchar sys_state; //全局变量
uchar key_state; //全局变量
/*======================主函数==================================*/
void main(void)
{
delay(400);
LCD_init();
IT0=1; //INT0下降沿中断
EX0=1; //允许INT1中断
IT1=1; //INT1下降沿中断
EX1=1; //允许INT1中断
EA=1; //允许中断
sys_state=1;
key_state=0; //无确认
Speak=0;
LCD_WriteCmd(0x01); //清屏
delay(10);
LCD_WriteCmd(0x80); //写入显示的地址
LCD_WriteStr("南京邮电大学",6); //南京邮电大学
LCD_WriteCmd(0x90); //自检系统
LCD_WriteStr("自检系统",4);
}
/*==========================================================*/
/*==========================================================*/
/*主机液晶屏函数*/
/*======================延时函数============================*/
void delay(uint ms) //延时函数
{
uchar ti;
while(ms--)
{
for(ti=0;ti<115;ti++)
{ }
}
}
/*=====================写指令函数=============================*/
void LCD_WriteCmd (uchar cmd) //写指令
{
uchar i,tmp;
bit data_tmp;
LCD_CS=1; LCD_SID=1; LCD_CLK=0; LCD_CLK=1;
LCD_CLK=0; LCD_CLK=1; LCD_CLK=0; LCD_CLK=1;
LCD_CLK=0; LCD_CLK=1; LCD_CLK=0; LCD_CLK=1;
LCD_CLK=0; LCD_SID=0; LCD_CLK=1; LCD_CLK=0;
LCD_SID=0; LCD_CLK=1; LCD_CLK=0; LCD_SID=0;
LCD_CLK=1; LCD_CLK=0;
tmp=cmd & 0xF0;
for (i=0;i<8;i++)
{
data_tmp=tmp&0x80;
LCD_SID=data_tmp;LCD_CLK=1;LCD_CLK=0;
tmp<<=1;
}
tmp=cmd<<4;
for (i=0;i<8;i++)
{
data_tmp=tmp&0x80;
LCD_SID=data_tmp;LCD_CLK=1;LCD_CLK=0;
tmp<<=1;
}
LCD_CS=0;
}
/*=======================写数据函数==============================*/
void LCD_WriteDat (uchar dat) //写数据
{
uchar i,tmp;
bit data_tmp;
LCD_CS=1; LCD_SID=1; LCD_CLK=0; LCD_CLK=1;
LCD_CLK=0; LCD_CLK=1; LCD_CLK=0; LCD_CLK=1;
LCD_CLK=0; LCD_CLK=1; LCD_CLK=0; LCD_CLK=1;
LCD_CLK=0; LCD_SID=0; LCD_CLK=1; LCD_CLK=0;
LCD_SID=1; LCD_CLK=1; LCD_CLK=0; LCD_SID=0;
LCD_CLK=1; LCD_CLK=0;
tmp=dat & 0xF0;
for (i=0;i<8;i++)
{
data_tmp=tmp&0x80;
LCD_SID=data_tmp;LCD_CLK=1;LCD_CLK=0;
tmp<<=1;
}
tmp=dat<<4;
for (i=0;i<8;i++)
{
data_tmp=tmp&0x80;
LCD_SID=data_tmp;LCD_CLK=1;LCD_CLK=0;
tmp<<=1;
}
LCD_CS=0;
}
/*=======================写汉字==============================*/
void LCD_WriteHanzi (uint *hanzi) //写汉字
{
uchar *data_tmp;
data_tmp=hanzi;
LCD_WriteDat (*data_tmp); //写高位数据
data_tmp++;
LCD_WriteDat (*data_tmp); //写低位数据
}
/*=======================写汉字串==============================*/
void LCD_WriteStr(uint *Str ,uchar num) //写字串(中英)
{
uchar i;
for(i=0;i<num;i++)
{
LCD_WriteHanzi(Str);
Str++;
}
}
/*========================液晶屏初始化=================================*/
void LCD_init(void) //液晶屏初始化
{
delay(30);
LCD_WriteCmd(0x30);
LCD_WriteCmd(0x0c); //必须是0x0c ,而不能是0x3c,资料存在错误
LCD_WriteCmd(0x01); //清屏
LCD_WriteCmd(0x06); //写入后自动右移,0x07作用不明
}
/*===========================================================================*/
/*12864液晶屏函数*/
/*============================================================================*/
void Putdword(unsigned char code*pC,int i,int j)
{
uchar hanzi;
int h=0;
for(row=i;row<2+i;row++)
{
for(col=j;col<16+j;col++)
{
hanzi=pC[h];
switch (col&0x40)
{
case 0:WrdataL(hanzi);break;
case 0x40:WrdataR(hanzi);break;
}
h++;
}
}
}
/**********************************************/
/*: 输出图片 */
/**********************************************/
void Putpicture(unsigned char code*pC)
{
int i=0;
uchar picture;
for(row=0;row<8;row++)
{
for(col=0;col<LCMLIMIT;col++)
{
picture= pC[i];
switch (col&0x40)
{
case 0:WrdataL(picture);break;
case 0x40:WrdataR(picture);break;
}
i++;
}
// Delay(2);
}
}
/****************************************/
/* 清屏,全屏幕清零 */
/****************************************/
void Lcmcls( void )
{
for(row=0;row<8;row++)
{
for(col=0;col<LCMLIMIT;col++)
{
switch (col&0x40)
{
case 0:WrdataL(0x0);break;
case 0x40:WrdataR(0x0);break;
}
}
}
}
/****************************************/
/* 清屏,全屏幕清零 */
/****************************************/
void Lcmcls( void )
{
for(row=0;row<8;row++)
{
for(col=0;col<LCMLIMIT;col++)
{
switch (col&0x40)
{
case 0:WrdataL(0x0);break;
case 0x40:WrdataR(0x0);break;
}
}
}
}
/****************************************/
/* 数据写输出 */
/****************************************/
void WrdataL(uchar X)
{
LocatexyL(); /*坐标定位,返回时保留分区状态不变 */
while(LCD_RdStatusL & Lcdbusy);
LCD_WDATL=X;
// Delay(1);
}
void WrdataR(uchar X)
{
LocatexyR(); /*坐标定位,返回时保留分区状态不变 */
while(LCD_RdStatusR & Lcdbusy);
LCD_WDATR=X;
// Delay(1);
}
/********************************/
/* 命令输出到左区控制口 */
/********************************/
void WrcmdL(uchar X)
{
while(LCD_RdStatusL & Lcdbusy);
LCD_WCMDL = X;/*命令输入到数据口 */
// Delay(2);
}
/********************************/
/* 命令输出到右区控制口 */
/********************************/
void WrcmdR(uchar X)
{
while(LCD_RdStatusR & Lcdbusy);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -