硬件设计:
链接:https://pan.baidu.com/s/1M52b64FYtIi1NtVH-OtR-w
提取码:yi2b
仿真图:
正弦波
三角波:
锯齿波:
方波:
程序设计
#include "reg51.h"
#include "LCD12864.h"
#include "font.h"
#define ADC_VALUE P0
sbit START = P3^4;
sbit OE = P3^6;
sbit EOC = P3^5;
#define COLLECT_NUM 64
uint8_t adc_collect[COLLECT_NUM];
uint8_t GatAdcValue()
{
uint8_t temp;
START = 1;
START = 0; // 下降沿触发转换
OE = 1;
while(EOC == 0); //等待转换完成
temp = ADC_VALUE;
OE = 0;
return temp;
}
void main()
{
uint8_t i,j,k,row,col,page,Data;
uint8_t old_Data,old_page,temp_Data,temp_Data2,temp_page;
LCD12864_Init();
while(1)
{
for(i = 0;i<COLLECT_NUM;i++)
adc_collect[i] = GatAdcValue();
for(j = 0;j<COLLECT_NUM;j++)
{
col = j; // 列
row = adc_collect[j]/4; // 计算在第几行
page = row/8;
Data = 0x01 <<(row-page*8);
refresh_one_list(col);
if(j!=0)
{
temp_Data2 = Data;
temp_page = page;
if(page == old_page) // 同一页内
{
if(Data > old_Data) //波形下降 向上补充
{
temp_Data = Data;
temp_Data = temp_Data>>1;
while(temp_Data!=old_Data)
{
temp_Data = temp_Data>>1;
Data = Data|(Data>>1); //向上补充
}
}
else if(Data < old_Data) // 波形上升 向下补充
{
temp_Data = Data;
temp_Data =temp_Data<<1;
while(temp_Data!=old_Data)
{
temp_Data =temp_Data<<1;
Data = Data|(Data<<1); //向下补充
}
}
} //end if(page == old_page) // 同一页内
else if(page > old_page) // 跨页下降 应该向上补充
{
temp_Data = Data;
for(k = 0;k<(row-page*8);k++) //向上补充到本页顶部
temp_Data |= (temp_Data>>1); //向上补充
write_one_list(page,col,temp_Data); //填充本页
page--; //往上一页
while(page != old_page) //填充两点之间的中间的页
{
write_one_list(page,col,0xFF);
page --;
}
if(page == old_page) // 来到了同一页
{
temp_Data = 0x80;
Data = 0x80;
if(Data>old_Data)
{
temp_Data = temp_Data>>1; // 上移一格
while(temp_Data != old_Data)
{
temp_Data = temp_Data>>1; // 上移一格
Data = Data|(Data>>1); // 向上补充
}
}
}
}//end else if(page > old_page) // 跨页下降 应该向上补充
else if(page < old_page) // 跨页上升 应该向下补充
{
temp_Data = Data;
for(k = 0;k<(7-(row-page*8));k++)
{ temp_Data|=(temp_Data<<1);}
write_one_list(page,col,temp_Data);
page++; //向下一页
while(page != old_page)
{
write_one_list(page,col,0xFF);
page++ ; // 下降一页
}
if(page == old_page)
{
Data = 0x01;
temp_Data = 0x01;
if(Data < old_Data)
{
temp_Data = temp_Data<<1; //向下移动一格
while(temp_Data != old_Data)
{
temp_Data = temp_Data<<1; //向下移动一格
Data |= (Data<<1); //向下补充
}
}
}
}//end else if(page < old_page) // 跨页上升 应该向下补充
old_Data = temp_Data2;
old_page = temp_page;
}
else
{
old_Data = Data;
old_page = page;
}
write_one_list(page,col,Data);
}
}
}
.
文件仅供参考
.