/*占空比输出测试 2017 4 26 PWMcgao******/
/*PWM 2017 4 16 pcb晶联讯显示屏*完成数字加减**/
/*****---------------************/
/*****| 频率输出测试 |**********/
/*****| 数值 00 |**********/
/****L284 CODE 1370*********************/
#include <REG51.H>
#include <intrins.H>
#define uint unsigned int
#define uchar unsigned char
sfr AUXR=0x8e; //Auxiliary register
sfr P5=0xc8;
uchar code disdt[11]={0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9,0xa3};
uchar code disds[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
uint vala,valb,valc; /**/
sbit cs1=P3^5; //PIN16
sbit reset=P3^6; //PIN17
sbit rs=P3^7; //PIN18
sbit sda=P1^0; //PIN19
sbit sck=P1^1; //PIN20
sbit DATAUP=P1^5; //加按键 PIN4
sbit DATADOWN=P1^2; //减按键 PIN1
sbit RUN=P1^3; //运行键 PIN22018 6 26
sbit ENTER=P3^2; //确认键 PIN13
sbit PWM1=P5^4; //PWM输出
sbit PWM=P3^3; //PIN14
bit timeflag; /****/
uint m,n; /****个十百代码缓冲**/
uint aa=0; /****RUN FLAG****/
uint t1,t2,t3,t4; /****总数个十百千****/
void delay(uint k); /****延时****/
/*------------------延时子程序------------------------*/
void delay(unsigned int t)
{
uint i,j;
for(i=0;i<t;i++)
for(j=0;j<500;j++);
}
uchar code zhuang1[]={
/*-- 文字: 状 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x 高=16x16 --*/
0x08,0x30,0x00,0xFF,0x20,0x20,0x20,0x20,0xFF,0x20,0xE1,0x26,0x2C,0x20,0x20,0x00,
0x04,0x02,0x01,0xFF,0x40,0x20,0x18,0x07,0x00,0x00,0x03,0x0C,0x30,0x60,0x20,0x00};
uchar code tai1[]={
/*-- 文字: 态 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x 高=16x16 --*/
0x00,0x04,0x04,0x04,0x84,0x44,0x34,0x4F,0x94,0x24,0x44,0x84,0x84,0x04,0x00,0x00,
0x00,0x60,0x39,0x01,0x00,0x3C,0x40,0x42,0x4C,0x40,0x40,0x70,0x04,0x09,0x31,0x00};
uchar code shi1[]={
/*-- 文字: 使 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x 高=16x16 --*/
0x40,0x20,0xF0,0x1C,0x07,0xF2,0x94,0x94,0x94,0xFF,0x94,0x94,0x94,0xF4,0x04,0x00,
0x00,0x00,0x7F,0x00,0x40,0x41,0x22,0x14,0x0C,0x13,0x10,0x30,0x20,0x61,0x20,0x00};
uchar code yong1[]={
/*-- 文字: 用 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x 高=16x16 --*/
0x00,0x00,0x00,0xFE,0x22,0x22,0x22,0x22,0xFE,0x22,0x22,0x22,0x22,0xFE,0x00,0x00,
0x80,0x40,0x30,0x0F,0x02,0x02,0x02,0x02,0xFF,0x02,0x02,0x42,0x82,0x7F,0x00,0x00};
uchar code mao_hao[]={
/*-- 文字: : (冒号) --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x 高=8x16 --*/
0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00};
char code num[]={
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00
};
/*写指令到LCD 模块*/
void transfer_command(int data1)
{
char i;
cs1=0;
rs=0;
for(i=0;i<8;i++)
{
sck=0;
if(data1&0x80) sda=1;
else sda=0;
sck=1;
data1=data1<<=1;
}
}
/*写数据到LCD 模块*/
void transfer_data(int data1)
{
char i;
cs1=0;
rs=1;
for(i=0;i<8;i++)
{
sck=0;
if(data1&0x80) sda=1;
else sda=0;
sck=1;
data1=data1<<=1;
}
}
/************LCD 模块初始化***************/
void initial_lcd()
{
cs1=0;
reset=0; /*低电平复位*/
delay(100);
reset=1; /*复位完毕*/
delay(20);
transfer_command(0xe2); /*软复位*/
delay(5);
transfer_command(0x2c); /*升压步聚1*/
delay(5);
transfer_command(0x2e); /*升压步聚2*/
delay(5);
transfer_command(0x2f); /*升压步聚3*/
delay(5);
transfer_command(0x23); /*粗调对比度,可设置范围0x20~0x27*/
transfer_command(0x81); /*微调对比度*/
transfer_command(0x28); /*0x1a,微调对比度的值,可设置范围0x00~0x3f*/
transfer_command(0xa2); /*1/9 偏压比(bias)*/
transfer_command(0xc8); /*行扫描顺序:从上到下*/
transfer_command(0xa0); /*列扫描顺序:从左到右*/
transfer_command(0x40); /*起始行:第一行开始*/
transfer_command(0xaf); /*开显示*/
cs1=1;
}
void lcd_address(uchar page,uchar column)
{
cs1=0;
column=column-1; //我们平常所说的第1 列,在LCD 驱动IC 里是第0 列。所以在这里减去
page=page-1;
transfer_command(0xb0+page); /*设置页地址。每页是8 行。一个画面的64 行被分成8 个页。我们平常所说的
第1 页,在LCD 驱动IC 里是第0 页,所以在这里减去1*/
transfer_command(((column>>4)&0x0f)+0x10); //设置列地址的高4 位
transfer_command(column&0x0f); //设置列地址的低4 位
}
/*全屏清屏*/
void clear_screen()
{
unsigned char i,j;
cs1=0;
for(i=0;i<9;i++)
{
lcd_address(1+i,1);
for(j=0;j<132;j++)
{
transfer_data(0x00);
}
}
cs1=1; //
}
/*显示16x16 点阵图像、汉字、生僻字或16x16 点阵的其他图标*/
void display_graphic_16x16(uchar page,uchar column,uchar *dp)
{
uchar i,j;
cs1=0;
for(j=0;j<2;j++)
{
lcd_address(page+j,column);
for (i=0;i<16;i++)
{
transfer_data(*dp); /*写数据到LCD,每写完一个8 位的数据后列地址自动加1*/
dp++;
}
}
cs1=1;
}
/*显示8x16 点阵图像、ASCII, 或8x16 点阵的自造字符、其他图标*/
void display_graphic_8x16(uchar page,uchar column,uchar *dp)
{
uchar i,j;
cs1=0;
for(j=0;j<2;j++)
{
lcd_address(page+j,column);
for (i=0;i<8;i++)
{
transfer_data(*dp); /*写数据到LCD,每写完一个8 位的数据后列地址自动加1*/
dp++;
}
}
cs1=1;
}
/*--------------数据转换------------------------*/
void datachuange()
{
m=vala/10; /*减t1x1000再减t2X100*/
n=vala-10*m; /*分离千 百 十 个三位*/
}
/*----------参数加-----------------*/
void DataOn( ) /*写数据B子函数*/
{ /*子函数开始*/
vala=vala+1; /**加一**/
if(vala>99)
vala=0; /*大于999归零*/
} /*子函数结束*/
/*----------参数减---------------*/
void DataDown( ) /*写数据B子函数*/
{ /*子函数开始*/
vala=vala-1; /**加一**/
if(vala==0)
vala=99; /*大于999归零*/
}
/*---------------------*/
void disdata() /*显示*/
{
display_graphic_8x16(1,(89),num+m*16); /*在第5 页,第89 列显示单个数字"0"*/
display_graphic_8x16(1,(89+8*1),num+n*16); /*在第5 页,第97 列显示单个数字"0"*/
}
/*---------------------*/
void dis_data() /*显示*/
{
m=valb/10; /*减t1x1000再减t2X100*/
n=valb-10*m; /*分离千 百 十 个三位*/
display_graphic_8x16(5,(89),num+m*16); /*在第5 页,第89 列显示单个数字"0"*/
display_graphic_8x16(5,(89+8*1),num+n*16); /*在第5 页,第97 列显示单个数字"0"*/
}
/*------------定时-占空比输出------------*/
void time() //需仿真
{
if(~!timeflag)
{
if(aa>=vala)
{
PWM=0; // 低电平时间
PWM1=0;
aa=0;
timeflag=0; //取反定时标志
}
}
else if(!timeflag)
{
if(aa>=valb)
{
PWM=1; //高电平时间
PWM1=1;
aa=0;
timeflag=1; //取反定时标志
}
}
}
/*------------------主循环程序----------------*/
void main( ) /*主程序开始*/
{
aa=0;
timeflag=1;
datachuange();
initial_lcd();
clear_screen(); //clear all dots 清除所有显示点
display_graphic_16x16(1,1,zhuang1); /*在第5 页,第1 列显示单个汉字"状"*/
display_graphic_16x16(1,(1+16),tai1); /*在第5 页,第17 列显示单个汉字"态"*/
display_graphic_8x16(1,(1+16*2),mao_hao); /*在第5 页,第25 列显示单个字符":"*/
display_graphic_16x16(1,(1+16*2+8),shi1); /*在第5 页,第41 列显示单个汉字"使"*/
display_graphic_16x16(1,(1+16*3+8),yong1); /*在第5 页,第49 列显示单个汉字"用"*/
vala=0;
datachuange();
disdata();
while(1) /*主函数循环*/
{ /*开始kcounter,kstatus*/
if(!DATAUP) //检测按键加
{ //数据处理
DataOn(); //参数加
valb=100-vala; //模拟显示100减设定值
datachuange(); //显示转换
disdata(); //显示设定参数
dis_data(); //显示100减设定值
delay(20); //
} //
if(!DATADOWN) //检测按键减 ENTER
{ //数据处理
DataDown(); //参数减
valb=100-vala; //模拟显示100减设定值
datachuange(); //显示转换
disdata(); //显示设定参数
dis_data(); //显示100减设定值
delay(20); //
}
if(!RUN) //检测按键减 ENTER
{ //数据处理
while(1)
{ //数据处理
delay(2000);
time();
}
}
} //while 循环
} //主循