打印
[STC单片机]

基于单片机12864单片机简易示波器

[复制链接]
楼主: 一路向北lm
手机看帖
扫描二维码
随时随地手机跟帖
21
一路向北lm|  楼主 | 2018-6-19 11:04 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
xyz549040622 发表于 2018-6-19 07:33
放个图片,看看你的效果如何?

我录的有视频,传到优酷给大家分享哈

使用特权

评论回复
22
dukecheng| | 2018-6-19 11:38 | 只看该作者
一路向北lm 发表于 2018-6-18 14:32
你参考下程序,应该不是很难,单片机部分好改就是OLED部分不太好改,成功了分享下经验。 ...

可能要写个OLED驱动

使用特权

评论回复
23
han0097| | 2018-6-19 13:30 | 只看该作者
坐等看效果

使用特权

评论回复
24
三木禾| | 2018-7-9 11:26 | 只看该作者
为什么代码里面RS、RW、E和P0口定义的引脚和原理图的不一样?还有为什么用keil编译的时候要用到xdata才行而用data,就是内部的就会显示144B,超过了内部RAM的存储容量,最后,我亲测了,LCD上并不能显示任何东西,求助

使用特权

评论回复
25
一路向北lm|  楼主 | 2018-7-9 12:44 | 只看该作者
三木禾 发表于 2018-7-9 11:26
为什么代码里面RS、RW、E和P0口定义的引脚和原理图的不一样?还有为什么用keil编译的时候要用到xdata才行而 ...

你的keil需要**,网上有教程,文件大了也可以编译,百度一下,毕竟keil不是完全免费,而且这个是 12的单片机。

使用特权

评论回复
26
三木禾| | 2018-7-9 15:27 | 只看该作者
C:\Users\KL-CP\Desktop
我这个是已**的吧
但是编译的时候是这样的C:\Users\KL-CP\Desktop
要把这个C:\Users\KL-CP\Desktop改成这个C:\Users\KL-CP\Desktop
才行C:\Users\KL-CP\Desktop

使用特权

评论回复
27
三木禾| | 2018-7-9 15:30 | 只看该作者
这些依次是上次发的图,之前以为那样可以上传,弄错了。

249a1ad9009c7cc0a6b8218ebf6abe3.png (8.78 KB )

249a1ad9009c7cc0a6b8218ebf6abe3.png

fb8cbcfef4237406b70cee8dca17f20.png (4 KB )

fb8cbcfef4237406b70cee8dca17f20.png

0b8193b129ac9dee28769474cc15e3d.png (3.8 KB )

0b8193b129ac9dee28769474cc15e3d.png

fee5fb9b67d8282546b1108f44201e9.png (8.99 KB )

fee5fb9b67d8282546b1108f44201e9.png

6aa35025aabba73335db3cc203a8188.png (28.75 KB )

6aa35025aabba73335db3cc203a8188.png

使用特权

评论回复
28
三木禾| | 2018-7-9 15:32 | 只看该作者
用了Large的那个之后就能编译成功了,但是烧录进芯片的时候什么东西都没有显示,我这也是12的单片机

使用特权

评论回复
29
三木禾| | 2018-7-9 15:38 | 只看该作者
还有,程序里的关于P1.0、P1.1、P1.2、P0的定义和原理图怎么不一样的?我觉得应该是P0.5、P0.6、P0.7和P2吧?求赐教,在线等

1531121768.png (18.45 KB )

1531121768.png

1531121714(1).png (25.33 KB )

1531121714(1).png

使用特权

评论回复
30
一路向北lm|  楼主 | 2018-7-9 21:08 | 只看该作者
三木禾 发表于 2018-7-9 15:38
还有,程序里的关于P1.0、P1.1、P1.2、P0的定义和原理图怎么不一样的?我觉得应该是P0.5、P0.6、P0.7和P2吧 ...

改下程序或者引脚都可以啊,这个问题不大,没问题的我已经测试过了。

使用特权

评论回复
31
jazzyfox| | 2018-7-9 23:43 | 只看该作者
dukecheng 发表于 2018-6-18 14:30
不知道好不好改在STC15w4k32的的学习板上,上面正好有个12864的OLED显示器? ...

oled,天哪,那玩意好小,真是玩玩了

使用特权

评论回复
32
三木禾| | 2018-7-10 16:20 | 只看该作者
可以显示了,程序没问题,谢谢。不过我现在要做一个双通道的示波器,想重复借用ADC_RES寄存器,但是当一个口显示正常时,另一个会不正常,我想请教一下,这个ADC的中断是不是不能重复使用的

使用特权

评论回复
33
一路向北lm|  楼主 | 2018-7-10 17:34 | 只看该作者
三木禾 发表于 2018-7-10 16:20
可以显示了,程序没问题,谢谢。不过我现在要做一个双通道的示波器,想重复借用ADC_RES寄存器,但是当一个 ...

具体怎么实现的我也不太懂,自己慢慢研究吧。

使用特权

评论回复
34
hawkj| | 2018-8-2 20:14 | 只看该作者
[STC单片机] 基于单片机12864单片机简易示波器,学习下

使用特权

评论回复
35
电技| | 2018-8-4 13:25 | 只看该作者
放个图片,看看效果

使用特权

评论回复
36
楼主给力

使用特权

评论回复
37
一路向北lm|  楼主 | 2018-8-5 20:51 | 只看该作者

使用特权

评论回复
38
一路向北lm|  楼主 | 2018-8-5 20:51 | 只看该作者
电技 发表于 2018-8-4 13:25
放个图片,看看效果

我有视频

使用特权

评论回复
39
diyocean| | 2018-8-29 15:58 | 只看该作者
#include <STC12c5a.H> 
#include<intrins.h>
#include<math.h>
sbit RS=P1^0; //并行的指令/数据选择信号, H数据, L命令
sbit RW=P1^1; //并行读写选择信号, H读, L写
sbit E=P1^2; //并行使能端, H有效, L无效
sbit jiakey=P3^0;
sbit jiankey=P3^1;
#define  LcdData P0
unsigned char dati=0;
unsigned char dat[100];
unsigned char over=0;
unsigned int temp=0;
unsigned char mode=0;
unsigned int delnop=0;
//////////////////////////////////////
unsigned char Lcd_CheckBusy(void)
{
    unsigned char Busy;
          LcdData=0xff;
    RS=0;
    RW=1;
    E=1;
    _nop_();
    Busy=LcdData&0x80;
    E=0;
    return Busy;
}
/*********************************
向LCD写入字节数据
**********************************/
void Lcd_WriteData(unsigned char Data)
{  
        while(Lcd_CheckBusy());
        RS=1;
        RW=0;
        E=0;
        _nop_();  
        _nop_();
        LcdData=Data;
        E=1;
        _nop_();
        _nop_();
        E=0;
}
/***********************************
从LCD中读出数据
************************************/
unsigned char Lcd_ReadData(void)
{
        unsigned char Temp;
        while(Lcd_CheckBusy());
        LcdData=0xff;
        RS=1;
        RW=1;
        E=1;
        _nop_();
           Temp=LcdData;
           E=0;
           return Temp;
}
/*************************************
想LCD中写入指令代码
**************************************/
void Lcd_WriteCmd(unsigned char CmdCode)
{  
        while(Lcd_CheckBusy());
           RS=0;
           RW=0;
           E=0;
           _nop_();  
        _nop_();
           LcdData=CmdCode;
           _nop_();
        _nop_();
           E=1;
           _nop_();  
        _nop_();
           E=0;
}
/**************************************
为加速逻辑运算而设置的掩码表,这是以牺牲空间而换取时间的办法
***************************************/
code unsigned int LcdMaskTab[]={0x0001,0x0002,0x0004,0x0008,0x0010,0x0020,0x0040,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x8000};
/***************************************
向LCD指定坐标写入一个象素,象素颜色有两种,0代表白(无显示),1代表黑(有显示)
****************************************/
void Lcd_PutPixel(unsigned char x,unsigned char y,unsigned char Color)
{
        unsigned char z,w;
        unsigned int Temp;
        if(x>=128||y>=64)
                return;
        Color=Color%2;
        w=15-x%16;//确定对这个字的第多少位进行操作
        x=x/16;//确定为一行上的第几字

        if(y<32) //如果为上页
                z=0x80;
        else     //否则如果为下页
                z=0x88;

        y=y%32;
        //EA=0;
        Lcd_WriteCmd(0x36);
        Lcd_WriteCmd(y+0x80);        //行地址
        Lcd_WriteCmd(x+z);     //列地址
        Temp=Lcd_ReadData();//先空读一次
        Temp=(unsigned int)Lcd_ReadData()<<8;//再读出高8位
        Temp|=(unsigned int)Lcd_ReadData();//再读出低8位
        //EA=1;
        if(Color==1) //如果写入颜色为1
                Temp|=LcdMaskTab[w];//在此处查表实现加速
        else         //如果写入颜色为0
                Temp&=~LcdMaskTab[w];//在此处查表实现加速
        //EA=0;
        Lcd_WriteCmd(y+0x80);        //行地址
        Lcd_WriteCmd(x+z);     //列地址
   Lcd_WriteData(Temp>>8);//先写入高8位,再写入低8位
   Lcd_WriteData(Temp&0x00ff);
        Lcd_WriteCmd(0x30);
        //EA=1;
}
/*****************************************
清除Lcd全屏,如果清除模式Mode为0,则为全屏清除为颜色0(无任何显示)
否则为全屏清除为颜色1(全屏填充显示)
******************************************/
void Lcd_Clear(unsigned char Mode)
{
        unsigned char x,y,ii;
        unsigned char Temp;
        if(Mode%2==0)
                Temp=0x00;
        else
                Temp=0xff;
        Lcd_WriteCmd(0x36);//扩充指令 绘图显示
        for(ii=0;ii<9;ii+=8)   
                for(y=0;y<0x20;y++)     
                        for(x=0;x<8;x++)
                        {         
                                //EA=0;
                                Lcd_WriteCmd(y+0x80);        //行地址
                                Lcd_WriteCmd(x+0x80+ii);     //列地址     
                                Lcd_WriteData(Temp); //写数据 D15-D8
                                Lcd_WriteData(Temp); //写数据 D7-D0
                                //EA=1;
                        }
        Lcd_WriteCmd(0x30);
}
/****************************************
LCD初始化
*****************************************/
void Lcd_Reset()
{  
        Lcd_WriteCmd(0x30);       //选择基本指令集
        Lcd_WriteCmd(0x0c);       //开显示(无游标、不反白)
        Lcd_WriteCmd(0x01);       //清除显示,并且设定地址指针为00H
        Lcd_WriteCmd(0x06);       //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位
}
//////////////////////////////////////
void InitADC()
{
P1ASF=0X80;
ADC_RES=0;
ADC_CONTR=0xef;
EADC=1;
}
void adc_isr() interrupt 5 using 1
{
ADC_CONTR=0xef;
if(over==0)
{
        temp=delnop;
        while(temp)
        {
        temp--;
        }
        dat[dati]=ADC_RES;
        dati++;
        if(dati>100)
        {
        dati=0;
        over=1;
        }
}
}
//////////////////////////////////////
void disp_0(unsigned char x,unsigned char y)
{
Lcd_PutPixel(x+1,y+1,1);
Lcd_PutPixel(x+1,y+2,1);
Lcd_PutPixel(x+1,y+3,1);
Lcd_PutPixel(x+2,y+0,1);
Lcd_PutPixel(x+2,y+4,1);
Lcd_PutPixel(x+3,y+1,1);
Lcd_PutPixel(x+3,y+2,1);
Lcd_PutPixel(x+3,y+3,1);
}
void disp_1(unsigned char x,unsigned char y)
{
Lcd_PutPixel(x+1,y+1,1);
Lcd_PutPixel(x+1,y+4,1);
Lcd_PutPixel(x+2,y+0,1);
Lcd_PutPixel(x+2,y+1,1);
Lcd_PutPixel(x+2,y+2,1);
Lcd_PutPixel(x+2,y+3,1);
Lcd_PutPixel(x+2,y+4,1);
Lcd_PutPixel(x+3,y+4,1);
}
void disp_2(unsigned char x,unsigned char y)
{
Lcd_PutPixel(x+1,y+0,1);
Lcd_PutPixel(x+1,y+2,1);
Lcd_PutPixel(x+1,y+3,1);
Lcd_PutPixel(x+1,y+4,1);
Lcd_PutPixel(x+2,y+0,1);
Lcd_PutPixel(x+2,y+2,1);
Lcd_PutPixel(x+2,y+4,1);
Lcd_PutPixel(x+3,y+0,1);
Lcd_PutPixel(x+3,y+1,1);
Lcd_PutPixel(x+3,y+2,1);
Lcd_PutPixel(x+3,y+4,1);
}
void disp_3(unsigned char x,unsigned char y)
{
Lcd_PutPixel(x+1,y+0,1);
Lcd_PutPixel(x+1,y+2,1);
Lcd_PutPixel(x+1,y+4,1);
Lcd_PutPixel(x+2,y+0,1);
Lcd_PutPixel(x+2,y+2,1);
Lcd_PutPixel(x+2,y+4,1);
Lcd_PutPixel(x+3,y+0,1);
Lcd_PutPixel(x+3,y+1,1);
Lcd_PutPixel(x+3,y+2,1);
Lcd_PutPixel(x+3,y+3,1);
Lcd_PutPixel(x+3,y+4,1);
}
void disp_4(unsigned char x,unsigned char y)
{
Lcd_PutPixel(x+1,y+0,1);
Lcd_PutPixel(x+1,y+1,1);
Lcd_PutPixel(x+1,y+2,1);
Lcd_PutPixel(x+2,y+2,1);
Lcd_PutPixel(x+3,y+0,1);
Lcd_PutPixel(x+3,y+1,1);
Lcd_PutPixel(x+3,y+2,1);
Lcd_PutPixel(x+3,y+3,1);
Lcd_PutPixel(x+3,y+4,1);
}
void disp_5(unsigned char x,unsigned char y)
{
Lcd_PutPixel(x+1,y+0,1);
Lcd_PutPixel(x+1,y+1,1);
Lcd_PutPixel(x+1,y+2,1);
Lcd_PutPixel(x+1,y+4,1);
Lcd_PutPixel(x+2,y+0,1);
Lcd_PutPixel(x+2,y+2,1);
Lcd_PutPixel(x+2,y+4,1);
Lcd_PutPixel(x+3,y+0,1);
Lcd_PutPixel(x+3,y+2,1);
Lcd_PutPixel(x+3,y+3,1);
Lcd_PutPixel(x+3,y+4,1);
}
void disp_p(unsigned char x,unsigned char y)
{
Lcd_PutPixel(x+0,y+0,1);
Lcd_PutPixel(x+1,y+0,1);
Lcd_PutPixel(x+1,y+1,1);
Lcd_PutPixel(x+2,y+0,1);
Lcd_PutPixel(x+2,y+1,1);
Lcd_PutPixel(x+2,y+2,1);
Lcd_PutPixel(x+3,y+0,1);
Lcd_PutPixel(x+3,y+1,1);
Lcd_PutPixel(x+4,y+0,1);
}
void disp_k(unsigned char x,unsigned char y)
{
Lcd_PutPixel(x+0,y+0,1);
Lcd_PutPixel(x+0,y+1,1);
Lcd_PutPixel(x+0,y+2,1);
Lcd_PutPixel(x+0,y+3,1);
Lcd_PutPixel(x+0,y+4,1);
Lcd_PutPixel(x+1,y+2,1);
Lcd_PutPixel(x+2,y+1,1);
Lcd_PutPixel(x+2,y+3,1);
Lcd_PutPixel(x+3,y+0,1);
Lcd_PutPixel(x+3,y+4,1);
}
void disp_hz(unsigned char x,unsigned char y)
{
Lcd_PutPixel(x+0,y+0,1);
Lcd_PutPixel(x+0,y+1,1);
Lcd_PutPixel(x+0,y+2,1);
Lcd_PutPixel(x+0,y+3,1);
Lcd_PutPixel(x+0,y+4,1);
Lcd_PutPixel(x+1,y+2,1);
Lcd_PutPixel(x+2,y+0,1);
Lcd_PutPixel(x+2,y+1,1);
Lcd_PutPixel(x+2,y+2,1);
Lcd_PutPixel(x+2,y+3,1);
Lcd_PutPixel(x+2,y+4,1);
Lcd_PutPixel(x+4,y+1,1);
Lcd_PutPixel(x+4,y+3,1);
Lcd_PutPixel(x+4,y+4,1);
Lcd_PutPixel(x+5,y+1,1);
Lcd_PutPixel(x+5,y+2,1);
Lcd_PutPixel(x+5,y+4,1);
}

void clr(unsigned char starx,unsigned char stary,unsigned char endx,unsigned char endy)
{
char x=0;
char y=0;
for(x=starx;x<endx;x++)
{
        for(y=stary;y<endy;y++)
        {
                Lcd_PutPixel(x,y,0);
        }
}
}
void disp_bj(void)
{
unsigned char x=0;
unsigned char y=0;
for(x=13;x<114;x++)
{
Lcd_PutPixel(x,52,1);
}
for(y=0;y<52;y++)
{
Lcd_PutPixel(13,y,1);
}
for(y=0;y<52;y++)
{
Lcd_PutPixel(114,y,1);
}
Lcd_PutPixel(13,51,0);
Lcd_PutPixel(13,41,0);
Lcd_PutPixel(13,31,0);
Lcd_PutPixel(13,21,0);
Lcd_PutPixel(13,11,0);
Lcd_PutPixel(13,1,0);
Lcd_PutPixel(114,51,0);
Lcd_PutPixel(114,41,0);
Lcd_PutPixel(114,31,0);
Lcd_PutPixel(114,21,0);
Lcd_PutPixel(114,11,0);
Lcd_PutPixel(114,1,0);

disp_0(5,50);
disp_1(5,40);
disp_2(5,30);
disp_3(5,20);
disp_4(5,10);
disp_5(5,0);
disp_0(117,50);
disp_1(117,40);
disp_2(117,30);
disp_3(117,20);
disp_4(117,10);
disp_5(117,0);

disp_2(13,58);
disp_hz(18,58);
disp_2(38,58);
disp_0(43,58);
disp_hz(48,58);
disp_2(63,58);
disp_0(68,58);
disp_0(73,58);
disp_hz(78,58);
disp_2(88,58);
disp_k(93,58);
disp_hz(98,58);

}
void line(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1)
{
int i,dx,dy,e,x,y;
Lcd_PutPixel(x0,y0,1);
Lcd_PutPixel(x1,y1,1);
dx=x1-x0;
dy=y1-y0;
x=x0;
y=y0;
if(dx>0&&dy>0)
{
if(dx>dy)
{
e=-dx;
for(i=0;i<dx;i++)
        {
        Lcd_PutPixel(x,y,1);
        x++;
        e=e+2*dy;
        if(e>=0)
                {
                y++;
                e=e-2*dx;
                }
        }
}
else
{
e=-dy;
x=x0;
y=y0;
for(i=0;i<dy;i++)
        {
        Lcd_PutPixel(x,y,1);
        y++;
        e=e+2*dx;
        if(e>=0)
                {
                x++;
                e=e-2*dy;
                }
        }
}
}
if(dx<0&&dy<0)
{
dx=x0-x1;
dy=y0-y1;
if(dx>dy)
{
e=-dx;
for(i=0;i<dx;i++)
        {
        Lcd_PutPixel(x,y,1);
        x--;
        e=e+2*dy;
        if(e>=0)
                {
                y--;
                e=e-2*dx;
                }
        }
}
else
{
e=-dy;
for(i=0;i<dy;i++)
        {
        Lcd_PutPixel(x,y,1);
        y--;
        e=e+2*dx;
        if(e>=0)
                {
                x--;
                e=e-2*dy;
                }
        }
}
}
if(dx>0&&dy<0)
{
dy=y0-y1;
if(dx>dy)
{
e=-dx;
for(i=0;i<dx;i++)
        {
        Lcd_PutPixel(x,y,1);
        x++;
        e=e+2*dy;
        if(e>=0)
                {
                y--;
                e=e-2*dx;
                }
        }
}
else
{
e=-dy;
for(i=0;i<dy;i++)
        {
        Lcd_PutPixel(x,y,1);
        y--;
        e=e+2*dx;
        if(e>=0)
                {
                x++;
                e=e-2*dy;
                }
        }
}
}
if(dx<0&&dy>0)
{
dx=x0-x1;
if(dx>dy)
{
e=-dx;
for(i=0;i<dx;i++)
        {
        Lcd_PutPixel(x,y,1);
        x--;
        e=e+2*dy;
        if(e>=0)
                {
                y++;
                e=e-2*dx;
                }
        }
}
else
{
e=-dy;
for(i=0;i<dy;i++)
        {
        Lcd_PutPixel(x,y,1);
        y++;
        e=e+2*dx;
        if(e>=0)
                {
                x--;
                e=e-2*dy;
                }
        }
}
}
if(dx!=0&&dy==0)
{
if(dx>0)
{
for(i=0;i<dx;i++)
        {
        Lcd_PutPixel(x,y,1);
        x++;
        }
}
else
{
dx=x0-x1;
for(i=0;i<dx;i++)
        {
        Lcd_PutPixel(x,y,1);
        x--;
        }
}
}
if(dx==0&&dy!=0)
{
if(dy>0)
{
for(i=0;i<dy;i++)
        {
        Lcd_PutPixel(x,y,1);
        y++;
        }
}
else
{
dy=y0-y1;
for(i=0;i<dy;i++)
        {
        Lcd_PutPixel(x,y,1);
        y--;
        }
}
}
}
void disp_ware()
{
unsigned char x=0;
unsigned char y=0;
                clr(14,0,15,52);
                for(x=1;x<100;x++)
                {
                        clr(x+14,0,x+15,52);
                        line(x+13,51-(dat[x-1]/5),x+14,51-(dat[x]/5));
                }
}
//////////////////////////////////////
main()
{
Lcd_Reset();
Lcd_Clear(0);
InitADC();
disp_bj();
EA=1;
while(1)
{
if(over)
        {
                disp_ware();
                if(jiakey==0)
                {
                  if(mode<3)
                         {
                          mode++;
                         }
//                        while(!jiakey);
                }
                if(jiankey==0)
                {
                if(mode>0)
                        {
                        mode--;
                        }
//                        while(!jiankey);
                }
        switch(mode)
        {
        case 0:
                delnop=1;
                disp_p(91,54);
                clr(66,54,71,57);
                clr(41,54,46,57);
                clr(16,54,21,57);
        break;
        case 1:
                delnop=40;
                disp_p(66,54);
                clr(91,54,96,57);
                clr(41,54,46,57);
                clr(16,54,21,57);
        break;
        case 2:
                delnop=440;
                disp_p(41,54);
                clr(91,54,96,57);
                clr(66,54,71,57);
                clr(16,54,21,57);
        break;
        case 3:
                delnop=4440;
                disp_p(16,54);
                clr(91,54,96,57);
                clr(41,54,46,57);
                clr(66,54,71,57);
        break;
        default:
        break;
        }
        over=0;
        }
}
}

使用特权

评论回复
40
enderman1| | 2018-11-12 20:48 | 只看该作者
厉害,收藏了,最近也在看这方面的东西

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则